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


HSPTV!掲示板


未解決 解決 停止 削除要請

2016
0507
Sado変数群を特定の値で初期化したい13解決


Sado

リンク

2016/5/7(Sat) 18:16:38|NO.75412


#deffunc VariableInit int p1 obj(p1)=0 objpos(p1,0)=0 objpos(p1,1)=0 return tmp=64 dim obj,tmp dim objpos,tmp,2
このような書き方だとエラー30「無効な名前がパラメーターに...」が出てしまいます。
これ自体、何がいけないのか全く分かりませんが、正直このエラーに興味はありません。



ゲームでキャラクター情報を初期化するときなどに、
スレッドのタイトルのようなことをしたいと思っています。

いままではdefineマクロで作っていましたが、
deffuncのようなサブルーチンではなくincludeと同じくコードのあちこちに展開されて、
コードが肥大化してしまうのではないかと心配になりました。

皆さんはどのような方法で実装していますか?
正規/一般的な手法を知りたいです。



この記事に返信する


Y_repeat(旧y.tack)

リンク

2016/5/7(Sat) 19:31:29|NO.75416

HSPは上から順に評価するので
最初に#defuncを実行しようとします

なので
#module
#global
で括るか
goto *avoid
*avoid
で括るかしてみてください



Y_repeat(旧y.tack)

リンク

2016/5/7(Sat) 19:41:18|NO.75419

僕はモジュールでくくって
ざっくり区切って管理してます
#module m_VariableInit
#global
でくぎったりして
モジュールに分割してます

変数をまとめて管理したいなら
モジュール変数の配列にして
インデックスを元に繰り返すとか



Sado

リンク

2016/5/7(Sat) 19:55:33|NO.75420

>Y_repeatさん
なるほど、module空間にしてしまえば解決できるんですね。
@の一文字付けるくらいならなにも問題なし!

ん?結局、p1が無効な名前になる原因ってなんでしょう。
エイリアス名なんて、なんでも良いのだとばかり思っていました。



ひろ

リンク

2016/5/8(Sun) 08:15:32|NO.75423

p1はエイリアス名と理解されているのであれば
Y_repeat(旧y.tack)さんが既に言われた通り上から評価されたときに
まずい状況が発生していることに気づくことかと思うのですが…



Y_repeat(旧y.tack)

リンク

2016/5/8(Sun) 14:46:34|NO.75426

例えば

#module var_int 〜 #global #module var_str 〜 #global
とか記述すると
上のは〜@var_int
下のは〜@var_str
と書いて使用します

#module
だけは複数の#moduleを使用すると
ごっちゃになるから あんまりお勧めしないですね



Sado

リンク

2016/5/8(Sun) 22:36:03|NO.75431

>ひろさん
すみません、何が起きているのか理解できていません。
プログラミングの知識がhspによるものだけなので、「まずいこと」と言われても
いまいちピンとこないのです……

エイリアスは、hspヘルプ知識で「変数みたいなもの」「ローカル変数みたいな扱い」
のように捉えていますが、恐らく正しくは無いのでしょうね。
軽く調べてみても余計にわけが分からなくなってしまいます。

「同じ空間を指すポインタをエイリアスと言う」
http://www.ertl.jp/~takayuki/readings/info/no06.html

ダンプとかローカル変数となにか違うのか???
と言った具合です。



>Y_repeatさん
>ごっちゃになるから あんまりお勧めしないですね
そのとおりですね
ちょっとしたマクロや関数は無名のmoduleに入れちゃえ!と済ませていましたが、
最近、モジュール名が分からず変数が参照できなくて困る事態がありました。。。



ひろ

リンク

2016/5/8(Sun) 23:20:57|NO.75432

エイリアスは別名という考え方の方が分かりやすいでしょうか

#deffunc VariableInit int p1

このp1は実体のある変数ではありません。
例えば
A=1
VariableInit A
とした場合、p1はAの別名であってp1という変数の実態がAと別に存在するわけではありません。
内部的にはAの変数のメモリアドレスが0x00000000に記録されているとした場合、
p1は呼び出された段階でp1のアドレスが0x00000000として実行されます。
呼び出されてもp1が実体を持つわけではなくあくまでAの別名として動くだけです。

ところが今回は呼び出されることなく実行されていますのでp1のメモリアドレスが
不定のまま実行しようとしています。
obj(p1)=0
この段階でp1を読みだそうにもメモリアドレスが割り当てられていないため、
別名p1の元の変数が指定されていない→無効な名前としてエラーになります。

#module〜#globalで括ったりgotoで飛ばしたりするように提案されたのは
正しく呼び出されないまま実行されてしまっているのを回避するためです。

あまりうまく説明できませんが伝わるでしょうか…



Y_repeat(旧y.tack)

リンク

2016/5/9(Mon) 01:18:56|NO.75433

詳しくはわかりませんが
引数は特殊な変数です

更に値渡しとかだと
命令から命令を呼び出す時に引数の名前が同じだとエラーが出ます
変数を要求する引数に値渡し変数を指定するとエラーになります

とりあえず引数変数と普通変数は違う存在だと
認識してるくらいです。自分は



Velgail

リンク

2016/5/9(Mon) 06:08:12|NO.75434

まずは、およそCでも同じことなので、参考資料として以下のURLを提示します。
http://www.cc.kyoto-su.ac.jp/~yamada/ap/parameter_argument.html

補足すると、
「実引数が関数に引き渡されるとき,その実引数自身ではなく,実引数のコピーが引き渡される.」
ということで、逆説的に
「実引数が関数に引き渡されるまで,仮引数の実体は存在せず,不定である.」
となります。以上、仮引数が存在しない変数扱いとしてエラーとなる理由。

さて、引っ掻き回すようで恐縮ですが、該当問題に対応する「問題児」な回答を投下してみます。


#deffunc init mes strf("%d,%d",looplev,sublev) a=100 if(sublev!=0){ return } mes a a/=2 mes a init mes a

つまり、「仮引数がない」命令・関数であれば、外から貫通できるということである。
全くよろしくないけどね!

(gosubなら貫通できるということを、deffuncで置き換えただけと言える?)



Sado

リンク

2016/5/10(Tue) 00:53:55|NO.75439

>ひろさん

>ところが今回は呼び出されることなく実行されていますのでp1のメモリアドレスが
>不定のまま実行しようとしています。
なるほどなるほど
>obj(p1)=0
>この段階でp1を読みだそうにもメモリアドレスが割り当てられていないため、
>別名p1の元の変数が指定されていない→無効な名前としてエラーになります。
エラーの原因はソレだったんですね!!!!!
すっきりしました。
hspと言えば初心者向けの言語だというのに、
「無効な名前」なんて抽象的なエラー文じゃあ初心者には分からないですよ……



Sado

リンク

2016/5/10(Tue) 01:02:29|NO.75441

>Velgailさん
仮引数と実引数の知識はありませんでした。
勉強になります!!!

つまり、
仮引数は、引数の型にintやdouble,strを指定した場合のこと。引き渡された後の値が実引数。
エイリアス(アドレス)は、varやarrayを指定した場合こと。
ということでしょうか。

しかし今回の名前無効エラー、僕にとっては、仮引数実引数よりも
アドレスうんぬんで説明を受けたほうが若干理解しやすいと思いました。



Y_repeat

リンク

2016/5/14(Sat) 18:07:49|NO.75489

せっかくなので報告

モジュールにモジュール変数を記述していないと
newmodしてもエラーになるという仕様があるみたいです



Y_repeat

リンク

2016/5/14(Sat) 18:09:31|NO.75490

>エラーの原因はソレだったんですね!!!!!
>すっきりしました。
>hspと言えば初心者向けの言語だというのに、
>「無効な名前」なんて抽象的なエラー文じゃあ初心者には分からないですよ……
じゃあ逆にどういうエラー文なら良いと思いますか?
というのも、自分は繰り返しマクロで閉じる命令を書き忘れた時の
エラー情報の変更を要望して採用されたことがあります

どういうエラーをどういう情報に変更して欲しい。とかは
提案していった方が良い活動かもしれません

自分もエラー情報があんまり合わなくて
エラー情報をあんまり読んでいない気もします



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