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


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
0210
しまくろねこ(おにいさん)モジュール(#module)について4解決


しまくろねこ(おにいさん)

リンク

2013/2/10(Sun) 00:56:49|NO.52271

こんにちわ。
HSP3でVBでいうところのクラスをインスタンス化に相当(ということでよいでしょうか?)する機能「newmod」があると知りまして試してみたのですが、
リファレンスを参考にしてもエラーが出てしまいます。
やりたいことは、#module〜#globalの間に#deffuncや#defcfuncで定義された命令や関数を、
#modfuncや#modcfuncに置き換えてクラス化したいのです。

下記を実行しようとすると、「error 28 : モジュール変数の指定が無効です (5行目)」となってしまいます。


1| #cmpopt varinit 1 2| 3| #module test_class 4| 5| #modfunc mod_fun 6| color 255, 0, 0 : mes "ok" 7| return 8| 9| #modcfunc mod_cfun 10| return 1 11| 12| #global 13| 14| 15| newmod instance, test_class 16| 17| mod_fun instance 18| 19| b = mod_cfun(instance) 20| 21| title "" + b 22| 23| stop



この記事に返信する


レノス

リンク

2013/2/10(Sun) 01:24:44|NO.52274

メンバ変数がないモジュールは、“クラス”(のようなもの)として扱われません。
なので適当にメンバ変数を追加すると動きます。
<p>
#module test_class x
</p>

おかしなことに、newmod は変数を初期化する命令として扱われてないので
実際に試すと未初期化変数のエラーが出ますけれど……。



しまくろねこ(おにいさん)

リンク

2013/2/10(Sun) 01:56:42|NO.52275

>レノスさん
お返事ありがとうございます。

>メンバ変数がないモジュールは、“クラス”(のようなもの)として扱われません。
>なので適当にメンバ変数を追加すると動きます。
リファレンス等を読んでも、#moduleで変数名が必須とは書いてありませんでした。
HSP上の仕様ということなのでしょうが、暗黙の了解として適当な変数名を記述しておけば良いのでしょうか?

>おかしなことに、newmod は変数を初期化する命令として扱われてないので
>実際に試すと未初期化変数のエラーが出ますけれど……。
はい。#moduleに適当な変数を記述して、「#cmpopt varinit 1」をコメントアウトしたところ確かに動きました。
newmod使用時に未初期化変数のエラーが出ないようにするには「#cmpopt varinit 1」をコメントアウトする以外ないでしょうか?



GENKI

リンク

2013/2/10(Sun) 03:28:12|NO.52276

> リファレンス等を読んでも、#moduleで変数名が必須とは書いてありませんでした。

newmodでモジュール型変数を作ってもモジュール変数が指定されていなければ、モジュール型変数は値を保持しておける変数を持たないわけなので…これは普通のモジュールをdeffuncで使うときと変わりありません。
モジュール型変数はモジュール変数を使うためのものなので、指定しないで使うのは意味ないです。


> newmod使用時に未初期化変数のエラーが出ないようにするには「#cmpopt varinit 1」をコメントアウトする以外ないでしょうか?

#cmpopt varinit 1
の後でnewmodする前に適当なので初期化しておけばとりあえず回避出来るようです。

dim instance とか dimtype instance, vartype("struct")
とか書いとくといいと思います。



モジュール型変数はforeach使う時に真価を発揮しますねー。 ←最近使い方がわかってきた。



しまくろねこ(おにいさん)

リンク

2013/2/10(Sun) 09:07:15|NO.52277

>GENKIさん
お返事ありがとうございます。

>newmodでモジュール型変数を作ってもモジュール変数が指定されていなければ、モジュール型変数は値を保持しておける変数を持たないわけなので…これは普通のモジュールをdeffuncで使うときと変わりありません。
>モジュール型変数はモジュール変数を使うためのものなので、指定しないで使うのは意味ないです。
なるほどです。

>dim instance
>とか
>dimtype instance, vartype("struct")
>とか書いとくといいと思います。
ご指摘のとおり未初期化変数のエラーが出なくなりました。

レノスさん、GENKIさんありがとうございました。
これにて解決です。



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