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


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0403
テック#deffuncで作成した引数が2つ以上の関数を呼び出すとエラー11解決


テック

リンク

2010/4/3(Sat) 15:39:35|NO.31763

#deffunc命令で、引数が2つ以上の関数を作成したのですが、
その自作関数を呼び出したときに、

error 4 : パラメーター式の記述が無効です (24行目)
--> method2(g_nvalue1, g_nvalue2)

のエラーが発生してしまいます。
これが自分の環境でしか発生しないのか、
ほかの皆さんの環境でも発生しているのか。
発生したことがある方は教えて下さい。

もし過去に同じスレが立っていたらすみません。

自分の環境は、HSP3.2.1です。
(HSP3.2で発生して、HSP3.2.1を入れなおしても発生しました。)

あと確認ですが、int型の変数に値を代入しようとすると
-->変数名が指定されていませんとエラーになります。

過去スレ「旧疑似関数命令におけるエイリアス禁止が有効になっている件について」で

「寧ろ、var型以外のモジュール命令やモジュール関数の引数が
定数扱いとなることを明記すべきでしょう。」とい回答がありました。
試しに引数をvar型にしてみたら大丈夫でした。

これはvar・array型以外の型の引数は、関数内では、
値を変更できないという仕様でよろしいのでしょうか?
以上よろしくお願いします。

下記は、確認の為に作成したスクリプトです。

#module SampleModule // 戻り値無しの、引数が1つの自作関数 #deffunc method1 int param1 mes "method1" return // 戻り値無しの、引数が2つの自作関数 #deffunc method2 int param1, int param2 mes "method2" return // 戻り値有りの、引数が2つの自作関数 #defcfunc method3 int param1, int param2 mes "method3" return param1 // 戻り値有りの、引数が2つの自作関数 // さらに関数内で、別の戻り値有りの自作関数を呼ぶ #defcfunc method4 int param1, int param2 mes "method4" // 引数に戻り値を代入しようとするとエラー param1 = method3(param1, param2) // 別の変数を作成し、戻り値を代入しようとするとOK param3 = method3(param1, param2) return param1 // 戻り値有りの、引数が2つの自作関数 // さらに関数内で、別の戻り値有りの自作関数を呼ぶ // 引数の型をvarにする #defcfunc method5 var param1, var param2 mes "method5" param1 = method3(param1, param2) return param1 #global // グローバル変数 g_nValue1 = 0 g_nValue2 = 0 *HspMain method1(g_nValue1) // コメントを外すとエラーになる // method2(g_nValue1, g_nValue2) g_nValue2 = method3(g_nValue1, g_nValue2) g_nValue2 = method4(g_nValue1, g_nValue2) g_nValue2 = method5(g_nValue1, g_nValue2) stop end



この記事に返信する


hatter

リンク

2010/4/3(Sat) 16:23:27|NO.31765

> error 4 : パラメーター式の記述が無効です (24行目)
> --> method2(g_nvalue1, g_nvalue2)
まず、以下のコメントの問題点。
誤: // 戻り値無しの、引数が1つの自作関数
正: // 戻り値無しの、引数が1つの自作命令
誤: // 戻り値無しの、引数が2つの自作関数
正: // 戻り値無しの、引数が2つの自作命令
ですね。
で、ようは命令なので
method2(g_nValue1, g_nValue2)
という構文は間違え。
method2 g_nValue1, g_nValue2
となるわけですね。

そもそも、戻り値の無い関数は関数じゃない気もしますしね。

> これはvar・array型以外の型の引数は、関数内では、
> 値を変更できないという仕様でよろしいのでしょうか?
こちらに関しては私は分かりません。



GENKI

リンク

2010/4/3(Sat) 16:31:29|NO.31766

> error 4 : パラメーター式の記述が無効です (24行目)
> --> method2(g_nvalue1, g_nvalue2)

命令の書式が間違っています。
#deffuncで作成した命令の場合、次のように記述します。
method2 g_nValue1, g_nValue2

ちなみにこれでもエラーになりますね。
boxf(10,10,100,110)


> あと確認ですが、int型の変数に値を代入しようとすると
> -->変数名が指定されていませんとエラーになります。

> #defcfunc method4 int param1, int param2
> param1 = method3(param1, param2)

method4の引数に指定されているのはどちらも「整数値」です。
したがって、「param1」は変数ではなく「整数値」です。
マニュアルをご確認ください。
変数を指定したい場合は、varかarrayを使います。


> 過去スレ「旧疑似関数命令におけるエイリアス禁止が有効になっている件について」で

アドレスを載せてもらえると助かります。

> これはvar・array型以外の型の引数は、関数内では、
> 値を変更できないという仕様でよろしいのでしょうか?

そのとおりです。
…と言い切りたいのですが、ローカル変数は私にはよくわからないので、
int, str, double, labelは定数として扱われます。
var, arrayは変数として扱われ、変数内の値を変更できます。
localは、私にはわからないので分かる方、解説お願いします。



hatter

リンク

2010/4/3(Sat) 16:51:13|NO.31767

> localは、私にはわからないので分かる方、解説お願いします。
http://3249.web.fc2.com/soft/calc.htmlのソースコード for HSP3.x
三行目において、localを大量に使用していますが、
これは関数の再帰的利用時に同じ変数を使われないようにです。
localは呼び出すときに値を渡す必要はありません。
で、かつその関数ないでのみ有効です。
関数ないで定義されている変数と違うのは、同じ関数で合っても呼び出しの元が違うと違う変数
として認識されるようです。(C言語の変数と同じ感じになります。)

#module #defcfunc test int a,local b c=a if c=2:mes test(c+1) return a*c #global c=test(2):b=test(3)
以上のスクリプトにおいて(特に意味のあるスクリプトではありません)、
test関数(便宜的に親test関数と呼ぶ)内で関数test(便宜的に子test関数と呼ぶ)を呼び出した時に。
変数c(関数内で作った変数)は
親test関数のと子test関数のと同一の物で
グローバル空間のとは異なるものです。
変数b(localで定義された物)は
親test関数のと子test関数のとグローバル空間のと全てが異なります。
なので、localは関数を再帰的に呼び出すなど特殊な時以外は使わないと思います。



テック

リンク

2010/4/3(Sat) 17:35:27|NO.31768

hatter様、GENKI様 回答ありがとうございます。

>ようは命令なので
>命令の書式が間違っています。
#deffunc命令のエラーの方は、私の単純ミスみたいですね^^;
C言語をやっていたのと、引数が1つのときの呼び出しにエラーが発生しなかったので、
つい括弧()が必要だと思っていました。
修正して、括弧を外したら上手くいきました。

>アドレスを載せてもらえると助かります。
下記が、過去スレのアドレスです。
http://hsp.tv/play/pforum.php?mode=all&num=30526

>int, str, double, labelは定数として扱われます。
>var, arrayは変数として扱われ、変数内の値を変更できます。
やはりintは、定数として扱われるのですね。
localについては、自分で調べてみます。
またこれからは、関数内で変更する変数については、var, array型を、
変更しない変数については、int, str, double, label型と
分けて使っていこうと思います。

以上ありがとうございました。



晩御飯

リンク

2010/4/3(Sat) 22:14:09|NO.31770

C言語をやっていたのなら分かると思いますが、
int, str, double, label型は値渡しで
var, array型はポインタ渡しに当たるのでは無いかと思われます。

個人的には値を返さなくともvoid型を返す関数、と
呼びたいなあ。



hatter

リンク

2010/4/3(Sat) 22:39:20|NO.31771

> 個人的には値を返さなくともvoid型を返す関数、と
> 呼びたいなあ。
そんなのありましたね〜。まあ、そんな関数を作ったこと無いですけどね。
C言語で渡すような値が無いときはintで1(真)を返すようにしてます。

テックさんは僕のlocal型の説明じゃ納得されなかったようですね。
僕の説明力不足で申し訳ない。



ANTARES

リンク

2010/4/4(Sun) 02:37:57|NO.31773

> 個人的には値を返さなくともvoid型を返す関数、と呼びたいなあ。
 HSPにvoid型があるかのような誤解を与える表現は慎みましょう。



テック

リンク

2010/4/4(Sun) 10:10:23|NO.31776

晩御飯様、hatter様、ANTARES様、
追加の回答ありがとうございます。

>var, array型はポインタ渡しに当たるのでは無いかと思われます。
この記述を見た後、var, array型は、関数内で内容を変更したら
呼び出し元では、値が変更されているのか気になったので試してみました。


#module SampleModule #deffunc method var param param = 1 return #global // グローバル変数 g_nValue = 0 *HspMain // 呼び出し前の値を表示する mes "呼び出し前:" + g_nValue // 自作命令を呼び出す method g_nValue // 呼び出し後の値を表示する mes "呼び出し後:" + g_nValue stop end

結果
呼び出し前:0
呼び出し後:1

結果から、var, array型は、ポインタ渡しで、
命令・関数内での変更内容が、呼び出し元でも反映されるようです。

>テックさんは僕のlocal型の説明じゃ納得されなかったようですね。
納得しなかった訳ではないのですが・・・(汗
「工学社:I/O BOOKS HSP3 リファレンスブック」で調べたら
hatter様の記述どおりでした。
あと補足しますと、
localは、厳密にはパラメータではなく、新規命令の動作をしていするものだそうです。
ローカル変数は、命令の再帰(自分自身をよびだすこと)や
変数名の局所化などプログラムを整理する際にも有効みたいですね。
ただ留意しなくてはいけないことは、
実行効率や速度を求める場面では、初期化のためのオーバーヘッドがあることだそうです。

以上ありがとうございました。



deque

リンク

2010/5/1(Sat) 19:08:20|NO.32410

> 個人的には値を返さなくともvoid型を返す関数、と
> 呼びたいなあ。
  ない。
>> そんなのありましたね〜。
  ないない。
>>> HSPにvoid型があるかのような誤解を与える表現は慎みましょう。
  C言語にvoid型があるかのような誤解を与える表現は慎みましょう。

晩御飯さん、hatterさん、ANTARESさん
御三方とも間違いを犯しています。

C言語には「void型」はありません。


どういうことか?


そちらで考えてもらってから説明するのが私のスタイルですが、
掲示板という特性上、この場で説明させていただきます。


C言語には「void型」はありません。

void i;
などと宣言したりしませんでしょう?

C言語で「void」と名のつく型は「void *」のような「ポインタ型」しかありません。 関数の戻り値の「void」は型ではなく「戻り値がない」ことをコンパイラへ知らせるための文法です。 同様に仮引数の「void」も「引数をとりません」とコンパイラへ知らせるための文法です。 これを踏まえて以下をもう一度読み直してみよう。 > 個人的には値を返さなくともvoid型を返す関数、と > 呼びたいなあ。 >> そんなのありましたね〜。 >>> HSPにvoid型があるかのような誤解を与える表現は慎みましょう。



hatter

リンク

2010/5/1(Sat) 20:39:21|NO.32412

dequeさんご指摘ありがとうございます。
あまりにもvoid型を使わないせいで(下らない言い訳),
勘違いしてました。

ISO規格によるとvoid*型だけではなくvoid型と言うのも存在するみたいですので、
void型を返すという表現が適切でないと言うわけですね。



ANTARES

リンク

2010/5/2(Sun) 00:03:40|NO.32420

>>>> HSPにvoid型があるかのような誤解を与える表現は慎みましょう。
>  C言語にvoid型があるかのような誤解を与える表現は慎みましょう。
 私が「C言語にvoid型がある」と考えていたのは事実ですが、
私がCを念頭に置いていたことすら、推測の域を出ないはずです。
また、HSPにvoid型があるか否かと、Cにvoid型があるか否かとは何の関連もありません。
さらに、dequeさんの主張全体が正しいか否かについては態度保留とさせていただきます。
(正直言って、調べるのめんどい
というか、んなこたあ、どうでもいい
というか、HSP掲示板上で議論すべき問題ではない)



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