HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2024
0502
Drakuji自作命令や関数内で引数名を指定すると「変数名が指定されていません」エラー対処3解決


Drakuji

リンク

2024/5/2(Thu) 14:48:52|NO.101649

自作命令や関数内で引数名を指定すると「変数名が指定されていません」エラー対処

お世話になっております、Drakujiです。

自作命令や関数で処理の中で引数を使用すると、時折
エラー23「変数名が指定されていません」が発生します。
原因がいまひとつよくわかっておりませんが、
自作命令や関数内部で引数名をうまく扱えないときがあるようです。

この問題のからくりについてもしご存じの方がいらっしゃいましたら教えてください。


暫定対処として
一旦命令や関数内部のみで使えるローカル変数を用意して
そこに引数を代入し、ローカル変数から参照するようにしています。


参考までに、以下、サンプルソースです。

//ASCIIコード表をもとに大文字のAを0として以降アルファベットを順番に値を返す関数 mes GetAdrToNum("B") #module #if 1 //←ここで検証を切り替えてください //直接引数をpeekに指定するとエラーになる #defcfunc GetAdrToNum str adr ;mes vartype(adr) //引数の型を調べてみようとしてもダメでした・・・ if peek(adr,0) >=65 && peek(adr,0) <= 80{ //エラー箇所:peek(adr,0) return peek(adr,0) - 65 } return -1 #else //エラーにならない方法 #defcfunc GetAdrToNum str adr, local _adr _adr = adr //とりあえずローカル変数に代入して問題を回避する if peek(_adr,0) >=65 && peek(_adr,0) <= 80{ return peek(_adr,0) - 65 } return -1 #endif #global

以上。



この記事に返信する


Hetzer

リンク

2024/5/2(Thu) 17:27:03|NO.101651

一般的に引数の値渡しと参照渡しといわれるもので、deffuncでstrにしたものは値渡し、varにすると参照渡しになります
strに指定するとadrには文字列が入るので、vartypeはエラーになります
https://prograpark.ninja-web.net/HSP/preproc/deffunc.html



GENKI

リンク

2024/5/2(Thu) 18:26:56|NO.101652

この辺って、なれないと分かりにくいところですよね。
原因は、変数を渡せていないからです。
str adr とした場合、adr は見た目は変数に見えますが実際は変数として使用できません。実際には文字列に置き換えられているような感じで動作します。(なので値渡しともちょっと違う感じ)

#module #deffunc test str a a = "a" return #global test "a"
なので、peekの箇所ではこんな風に動作している状態です。

adr = "B" mes peek(adr,0) ; 期待した動作 mes peek("B",0) ; エラー箇所での実際の動作

関連資料
https://qiita.com/sakura-crowd/items/c6d485884d97c586603d


ところでこの場合なら、「, local _adr」は必要ありません。
再帰するわけでもなく、最初に「_adr = adr」として初期化もしているのでローカル変数を使用する必要がありません。



Drakuji

リンク

2024/5/2(Thu) 19:05:46|NO.101653

Hetzerさん、GENKIさん。
早速の回答ありがとうございます。
上記の説明でスッキリ納得ができました。

引数で入ってきた値が自作命令や関数の中では
「変数」に代入されているというイメージをしていましたが、
引数に入れたものは値やデータそのものということで、
引数の名前は「単なる名前」ということですね。

関数と命令の引数指定を要求されるものは「値」や「文字列」だけではなくて
「変数」を要求していることがあるということを覚えました。

詳しく解説していただきありがとうございます。



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.101649への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

ONION software Copyright 1997-2023(c) All rights reserved.