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


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
0909
ひらまる未初期化の変数があります。17解決


ひらまる

リンク

2011/9/9(Fri) 15:54:03|NO.41257

HSP3.3RCになって「未初期化の変数があります」のエラーが追加されてデバッグがやりやすくなったのは良いのですが、
コンパイルエラーが出たときにエラーダイアログが「未初期化の変数があります」で埋まってしまい、
一番下に表示されている肝心のエラーが読めません;

コンパイルエラーが、スクロール可能の編集不可能エディットボックスなどに出力されれば、
全容が読める上にコピペもしやすいのですが…

onerrorはコンパイルエラーに割り込めないしそもそもエラー番号しかわからないし…
コンパイルエラーのログを取得する方法としては…
hspcmpでコンパイルしてエラーメッセージを取得…するしかないのでしょうか?



この記事に返信する


lltakashill

リンク

2011/9/9(Fri) 16:35:29|NO.41258

ええっとですね、未初期化の変数を初期化してみてはどうでしょう?
たとえば、スクリプトの最初のほうに

// windowの作成 〜 // 変数の初期化 ←ココ! 〜
みたいな感じで、自分は使っています。
参考になれば幸いです。



ひらまる

リンク

2011/9/9(Fri) 16:39:50|NO.41259

>ええっとですね、未初期化の変数を初期化してみてはどうでしょう?
ヴぇ〜;;
変数を初期化しなくても使えるのはHSPの強みだと思っていたのに……

repeat 3 mes a a ++ loop ;error ;↑コメントを外すと未初期化の変数がありますエラー
この程度のことも許されないのですか……

ていうか未初期化を検出できるのに変数の初期値がNULLじゃなくて0ってどういうことなのでしょうか?



lltakashill

リンク

2011/9/9(Fri) 16:45:58|NO.41260

追記 初期化の方法
例えば、整数型であれば、仮に変数をaとすると、

a = 0
そして、実数型であれば(上記の方法でも特に問題はない場合もありますが)
仮に変数をbとすると、

b = 0.000000
そして、文字列型であれば、仮に変数をcとすると、

c = ""
というような風でいいんじゃないでしょうか?
あまりその変数がどんな物なのか分からないときは、そのまま(未初期化したまま)でも
いいと思いますよ^^



lltakashill

リンク

2011/9/9(Fri) 16:53:36|NO.41261

おっと、レス早いですね^^;
上記でのスクリプト(ひらまるさんの)5行目の
>;error
ですが、
この";"、つまりコメントをはずすと"error"が変数なのか関数なのかどうかが
判断できなくて、エラーが起こっているようですね。
この"error"が何なのかが、状況から判断できないのですが><



ORZ

リンク

2011/9/9(Fri) 16:57:15|NO.41262

個人的にはオプションかなんかでエラーを出すか否か切り替えられるようにするべきだと思うな



lltakashill

リンク

2011/9/9(Fri) 16:59:22|NO.41263

ん〜、そうですね^^
確かに、慣れるまではうっとうしかったですからね。
まあ、初期化は重要なことですが...



Cookies

リンク

2011/9/9(Fri) 17:23:26|NO.41264

>この";"、つまりコメントをはずすと"error"が変数なのか関数なのかどうかが
>判断できなくて、エラーが起こっているようですね。
>この"error"が何なのかが、状況から判断できないのですが><

(勝手に思っているだけですが)ひらまるさんは、
エラーメッセージがどのように出るかを示すために
わざわざエラーを起こすようにしたのではないでしょうか。
この行がなければ「未初期化の変数があります」の実例を示すことができませんから。


>個人的にはオプションかなんかでエラーを出すか否か切り替えられるようにするべきだと思うな
賛成です。
Cコンパイラとかでは、致命的でないエラーの表示/非表示を切り替えられますしね。



TTRUKO

リンク

2011/9/9(Fri) 17:32:09|NO.41265

なるほど…#cmpoptとかのコンパイルオプションで消せるのかと思ったら
警告/エラーの切り替えしかできないのか〜



lltakashill

リンク

2011/9/9(Fri) 17:35:27|NO.41266

>ひらまるさんは、
>エラーメッセージがどのように出るかを示すために
>わざわざエラーを起こすようにしたのではないでしょうか。
そうかもしれませんね。
それなら、

#cmpopt ppout 1 ; プリプロセッサ結果をファイル出力します
を、思いつきました。
こんな感じでどうですかね?



ひらまる

リンク

2011/9/9(Fri) 17:43:06|NO.41267

>この"error"が何なのかが、状況から判断できないのですが><
これはCookiesさんが仰っているように、わざとエラーを出すための1行です。
わかりづらくてすみません;

びぢゅあるすでぃぢおー や いくりぷすー なんかでは、
エラーや警告はリストビューみたいなのにずらーっと表示されますが、
HSPのコンパイルエラーはダイアログだけっていうのは今回のような場合ちょっと困ります…
従来のダイアログも表示しつつ、デバッグウィンドウに「コンパイルエラーログ」
みたいなタブを追加してくれるととてもありがたいのですけどね……



TTRUKO

リンク

2011/9/9(Fri) 17:50:37|NO.41268

>lltakashillさん
あれ?ppoutで出力されるのって、
単なるプリプロセッサ実行後のスクリプトファイルじゃなかったですか?
エラーログとかが出力されてた覚えがないような…
(違ってたらごめんなさいっ^^;)



ひらまる

リンク

2011/9/9(Fri) 17:59:08|NO.41271

>lltakashillさん

#cmpopt ppout 1 ; プリプロセッサ結果をファイル出力します repeat 3 mes a a ++ loop error
上記でコンパイルすると、
hsptmp.iというファイルが出力されました。
内容は……実際に確認してみてください;

あれ? っていうかもしかして……
HSPスクリプトエディタでコンパイルエラーが出ると、
「結果レポート」とかいう編集不可能エディットボックスを含んだエラーダイアログが出る?

うに!?

もしかしてhspcmpWrapper.dllでコンパイルしていた自分の環境依存問題…???

ま…まぁ、そういうこともありますよ(猛省


でもせっかくだから、変数の初期化を検出できるならNULLを実装して欲しいですね。
特に変数にラベルを代入した場合、

labelVar = *label if labelVar != NULL : gosub labelVar stop *label mes "ラベル呼ばれないよ" return
このような使い方ができないのが不便ですね(・ω・)

labelVar = *label if vartype( labelVar ) == 1 : gosub labelVar stop *label mes "ラベル呼ばれちゃった" return
まぁ、こういった方法があるのですが……



lltakashill

リンク

2011/9/9(Fri) 18:00:58|NO.41272

後で書き込んでおきましょうか?
http://www.onionsoft.net/wp/archives/516の要望に



check

リンク

2011/9/9(Fri) 18:24:20|NO.41273

というかオプションで検出できるようにしたんじゃなかったのか。
変数の初期化を強制してくるなんてめんどくさいな。

あと、プリプロセッサの吐き出すエラーのなかに、
怪しい英語のメッセージが混ざっているのはなぜだろうか。
日本語で統一すればいいのに。



ひらまる

リンク

2011/9/9(Fri) 23:31:51|NO.41280

>lltakashillさん
自分で書き込んで来ました。気を遣わせてすみません(・ω・)

>プリプロセッサの吐き出すエラーのなかに、
>怪しい英語のメッセージが混ざっているのはなぜだろうか。
たしかに…エラーメッセージは読みづらいものという先入観があって気付きませんでした…
これはHSPのコンセプト的には、読みやすい日本語に統一した方が良いのでしょうか…



info

リンク

2011/9/10(Sat) 00:42:23|NO.41282

思いついて、気づいたら作ってました(笑)
使用される全ての変数を 0 で初期化するテキストを生成します。

役に立つのかは解りませんが(汗)

生成されるテキストをスクリプトの先頭にコピーペーストすれば
とりあえず、表示するメッセージを減らす事は出来ます。


// // 未初期化の変数を初期化する。 // txt_mesbox ={" ; これはコピーとスクリプト変換の例です ; このまま実行ボタンを押してみて下さい。 #未初期化の変数があります(a) #未初期化の変数があります(f@test1) #未初期化の変数があります(g@test1) #未初期化の変数があります(b@test1) #未初期化の変数があります(f@test2) #未初期化の変数があります(g@test2) #未初期化の変数があります(b@test2) "} gsel 0,2 title "edit に 【未初期化の変数が有る旨の、メッセージ】をコピーして実行を押してください" objsize ginfo_winx , 20 button gosub "実行",*run_ mesbox txt_mesbox , ginfo_winx,ginfo_winy-20,,0 hwnd_mesbox = objinfo_hwnd(stat),stat stop *run_ rt = "// 未初期化の変数初期化\n// 次行の\"#if\"で有効無効を切り替えます。\n#if 1\n" tgt = 0 repeat strlen(txt_mesbox) c=peek(txt_mesbox,cnt) if(c=='('){ tgt = cnt }else:if(c==')'){ is=tgt+1 rt += strf("%s = 0\n",strmid(txt_mesbox,is,cnt-is)) } //wait 1 loop rt+="#endif" objprm hwnd_mesbox.1 ,rt return



ひらまる

リンク

2011/9/10(Sat) 02:11:00|NO.41283

>infoさん
ははぁなるほど…そういう手もありますね。

ところで
本来の「未初期化の変数」がエラーになる原因として、
タイプミスによる変数名の打ち間違いがあります。

しかし以下のスクリプトはコンパイルエラーではなく実行エラーになるため、
未初期化の変数が〜というエラーは出ません。

arf = "アート" mes strmid( art, 0, 64 )
意味なくなくなくなくなくない? といった感じです。
しかしコンパイルエラーが起きればartが初期化されていないという表示が出ます。
そこではじめて、
「えーart初期化したしぃー」
「あっ! artだと思ったらarfになってる!!」
と気付くのだと思います。

これは逆に、せめて実行エラーが起きた行で未初期化の変数が使われていた場合には、
未初期化の変数がありますという警告を出して欲しいのですが…

欲張りですか? こだまでしょうか? いいえ、誰でも(・ω・)



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