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


HSPTV!掲示板


未解決 解決 停止 削除要請

2017
0419
DoubleQuote#未初期化の変数があります について4解決


DoubleQuote

リンク

2017/4/19(Wed) 21:07:04|NO.79150

デバッグ画面に

#未初期化の変数があります(disp)
等と表示されることがあります。
変数の初期化がなされていなくてもそれとなく使えるのがHSPの強みだということは理解しているのですが
本当に初期化しなくていいのでしょうか?流れとしては初期化しておいた方が良いのでしょうか?
処理スピードとしてはどちらが早いのか気になります。
使う時に初期化されるから、先にまとめて初期化しない方が早いのでしょうか?
皆様は使用する変数について、きちんとすべて定義しているでしょうか?どのようにプログラム書いている
のか教えてください。

この疑問が経緯として、初期化しているハズなのに未初期化の変数があります
と出ていて悩んでいたのがきっかけです。以下がそれを再現したスクリプトです。


*main gosub *getdisplays mes disp button "",*label // Debug画面表示させる為にわざと存在しないラベルにしてある stop *getdisplays disp = 4 return

このスクリプトにおいて、disp変数は、getdisplaysの中で定義されていますがメインの方では
定義されていないので、デバッグ画面に見初期化されていないと表示されているのではないか?
と考えて居ます。
メインの方では定義せず、サブルーティンの方で定義する形でも別に問題ないのではないのではと
考えて居ます。


また、似たような話しで、

dim year // 数値型として宣言 year = gettime(0) year = str(year) // 文字列型として使用 dialog ,,year
このプログラム、問題無く実行されます。しかしながら、見て頂きますと
同じ変数を、数値型として使用し、それをそのまま文字列に使用しているのが分かると思います。
よくやる手段だと思いますがこういう使い方はあまり推奨されないでしょうか?
しかしながら変数を使う数を減らせるというメリットもあるかと思います。

色々と質問が多くなり、まとまらない文章となってしまい、すみませんが、皆様の考え方を知りたく
また、処理スピードなど、知りたく、質問させて頂きました。



この記事に返信する


名無し

リンク

2017/4/19(Wed) 21:25:14|NO.79151

私はできるだけ#cmpopt varinit 1で未初期化変数のエラーを出すようにしています。



さか

リンク

2017/4/19(Wed) 21:58:49|NO.79152

結論から言うと問題ないです。

HSP仕様はBASIC言語ベースなので変数の型定義や初期化は手続きしなくても良い仕様
です。(使う時点で0初期化されてる)

処理速度は初期化しない方が単純に処理がないため速いはず(微々たるもの)ですが
名無しさんのようにエラーにして初期化させるメリットはあると思います。
例えば、以下です。
・変数記述間違え。iと書くところをjと間違えてしまった場合エラーで気が付く。
・文字変数か数字変数かを初期化して明確(間違えないよう)にする。

最後に自分の場合ですが、主要の変数は型定義して初期化します。
i,j等の一次的な変数は初期化意識してないです。
名無しさんのようにコンパイルエラー設定にしても良いかなとも思っています。



掘木

リンク

2017/4/19(Wed) 21:59:18|NO.79153

こちらの主観も入るのでなんとも回答しにくいところ。

>本当に初期化しなくていいのでしょうか?
未初期化の変数が初期値として数値型の0値が与えられるようになっている。
なので、初期化を明示的にする必要はないと思う。

>処理スピードとしてはどちらが早いのか気になります。
初期化は実行コード内に含まれるため処理時間がかかります。
ただ、その処理時間が気になるほどのものかどうかは実際に測定して体感するといいかと。
個人的には無視できると思う。

>使う時に初期化されるから、先にまとめて初期化しない方が早いのでしょうか?
コード一般論でいえば、使用直前に初期化するべきが圧倒的に多いと思う。
先にまとめて初期化するのは、変数の参照を離れたところに増やし、
可読性を著しく下げる要因につながると考えられる。
本来の未初期化変数の警告は「使うときに初期化」がされていないことを忠告するものですし。

>皆様は使用する変数について、きちんとすべて定義しているでしょうか?
各々の流儀による。

>初期化しているハズなのに未初期化の変数があります と出ていて悩んでいたのがきっかけです。
未初期化変数の検出機能は過去ログで言ってるけどもかなり不思議な挙動を持っている。
目安にしかならない。

>同じ変数を、数値型として使用し、それをそのまま文字列に使用しているのが分かると思います。
>よくやる手段だと思いますがこういう使い方はあまり推奨されないでしょうか?
>しかしながら変数を使う数を減らせるというメリットもあるかと思います。
その変数の型が重要じゃないのなら問題ないんじゃないの。
変数の定義数はメモリ使用量に関係します、が、そこを切り詰めて可読性を下げていると感じるなら、
やらないほうがいいのかもしれません。
それは個人の流儀によると思います。


私は宣言/初期化は省略しないように、変数は型を固定するくらいの感覚で組んでますけど、
ガイドラインもないですし、個人の流儀に従うものかと思います。
処理速度は実際に速いことが重要か、間違いが起こらないほうが重要か、そこらも個人のバランス次第かと。



DoubleQuote

リンク

2017/4/21(Fri) 17:17:31|NO.79179

みなさんの考え聞けて良かったです、ありがとうございました。



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