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


HSPTV!掲示板


未解決 解決 停止 削除要請

2021
0506
mikotoif文の条件式に指定が許されるのは命令・関数・マクロの中で関数・マクロが許されますか?14解決


mikoto

リンク

2021/5/6(Thu) 14:31:27|NO.92758

皆さんに質問です。
if文の条件式に指定が許されたのは命令・関数・マクロの中で関数・マクロを指定して動作しました。
また、命令をif文の条件式の二つにいずれかに入れても機能しないというのは合っていますか?
その他にも配列変数、変数、文字列、数値をif文の条件式に入れてエラーにならず動作しました。
また、私はif文の条件式を入れるときは文字列、数値などを直接指定せず必ず変数で指定します。
なぜなら、条件式に数値、文字列などを直接入れてしまうと変更する時に時間と手間がかかるからです。
また、&などの論理演算子は使わないように目的が達成できるように努めています。
そうすることでバグを生むことを減らすことができるのです。
そして皆さんは、if文を書くときに氣を付けていること、バグを生みにくいおすすめの書き方などを教えて下さると助かります。



この記事に返信する


ちくわ

リンク

2021/5/6(Thu) 16:16:16|NO.92759

>>if文を書くときに氣を付けていること

私は主に条件式が見やすいよう工夫しています。
例としては、
if vcalc=-1

if ( vCalc == -1 )
として記述しています。
括弧で囲う、=を==とするのは他の言語と混ざらないようにするためでもあります。



mikoto

リンク

2021/5/6(Thu) 18:33:39|NO.92760

ちくわさん、教えていただきありがとうございます。
条件式に丸括弧を加えて見やすくするすべを取り入れたいと思います。
他の皆さんの意見も引き続きお待ちしております。



GENKI

リンク

2021/5/7(Fri) 02:45:39|NO.92761

注意していることといえば、久しぶりに使うときは一度f1キー押して使い方を確認する。
if文は言語によって表現の違いが大きく現れる場合があります。条件式も違ったりするのでHSP3に限らずですが、しばらく触っていなかった言語を使うときは都度調べます。
どうしてもたまにあるんです。「あれ?この言語はこの書き方だっけ?」というのが。
なるべく各言語の標準的な書き方で使いたい派閥なので、不安なときは確認します。
あ、でもとりあえずカッコつけとくのはたまにやります。


> 命令をif文の条件式の二つにいずれかに入れても機能しないというのは合っていますか?

正しいですが、一部正しくありません。
1つif文に書ける「条件式」は、1つだけです。「if」〜「:または{」の間に書いた1文がまるごと1個の「条件式」です。
HSP3のif文の「条件式」は、「条件式」として書かれた式の計算結果の数値を見て判定しています。

条件式の計算結果が 0 の場合  :条件が満たされていないとして処理する
条件式の計算結果が 0 以外の場合:条件式が満たされているとして処理する

IF 123 : mes "True" : else : mes "False" a = 10>0 ; 条件式の計算結果は数値なので、変数に代入できます。 mes a a = 10<0 mes a a = (10>0) and (3>2) mes a ; a = mes "test" ; ←これはエラーになる
命令の結果は stat などを通して値を返しますが、命令の書式は値を返さないので式として使用できません。なので、if文の条件式には使用できません。
関数は必ず値を返すので、条件式として使用できます。
マクロは値や関数を割り当てれば値を返すので条件式として使用できますが、命令をマクロに割り当てた場合は値を返さないので条件式には使用できません。


> &などの論理演算子

前述した説明にも関連するのですが、論理演算とマニュアルに記載されていますが実際にはビット演算が行われています。(「プログラミング・マニュアル 3.12.条件判断」参照)
これを知っていないと、思ったとおりに分岐してくれずに困ることがあります。HSPのIF文で誰もが通る落とし穴ですね。


> また、&などの論理演算子は使わないように目的が達成できるように努めています。
> そうすることでバグを生むことを減らすことができるのです。

読みやすく、書いてあることの意味が分かりやすく、バグやミスを見つけやすいのであればそれでいいと思います。
私も条件が多くなると場合分けが複雑になりすぎて手に負えなくなることがあるので、論理演算を理由なく使うことがないように気をつけています。
ただ論理演算子を避けるのではなく、より理解して使うと表現の幅が広がるので、もっと見やすく分かりやすく、バグやミスを見つけやすい書き方ができると思いますよ。



mikoto

リンク

2021/5/7(Fri) 07:04:58|NO.92762

GENKIさん、詳しい情報ありがとうございます。

>命令の結果は stat などを通して値を返しますが、命令の書式は値を返さないので式として使用できません。なので、if文の条件式には使用できません。
命令の結果は statに値を返すのは知りませんでした。実際にHSPエディタで確かめてみます。
プログラミング・マニュアル 3.12.条件判断の項目を確認してみます。
>論理演算子を避けるのではなく、より理解して使うと表現の幅が広がるので、もっと見やすく分かりやすく、バグやミスを見つけやすい書き方ができると思いますよ。
わかりました。バグやミスを見つけやすい書き方についてこちらとしても模索しています。
今、思いつくのは論理演算子はif文条件式に二つ以上、つかわないように努めることです。
引き続き皆さんの意見をお待ちしております。



Y_repeat

リンク

2021/5/7(Fri) 14:40:17|NO.92764

return

サブルーチンから復帰

return p1

p1 : システム変数代入値

解説
gosub命令やユーザー定義命令などで呼び出しされたサブルーチンを終了します。return命令により、スタックを戻し呼び出し元に復帰します。
p1を指定することにより、サブルーチンから値をシステム変数に反映させることができます。
p1に数値を指定した場合には、システム変数statに代入されます。
p1に文字列を指定した場合には、システム変数refstrに代入されます。
p1に実数値を指定した場合には、システム変数refdvalに代入されます。
p1の指定を省略した場合には、システム変数の代入は行なわれません。

となってますね
自分も忘れてましたw



Y_repeat

リンク

2021/5/7(Fri) 14:49:03|NO.92766

>今、思いつくのは論理演算子はif文条件式に二つ以上、つかわないように努めることです。
論理演算子が全部ビット演算子だからじゃないすかね

上手く表現出来ないですけど

repeat 4 if (cnt&1)&(cnt&2):mes cnt loop mes "////////////////////////////////" repeat 4 if cnt&1{ if cnt&2:mes cnt } loop mes "////////////////////////////////" repeat 4 if (cnt and 1)and(cnt and 2):mes cnt loop mes "////////////////////////////////" repeat 4 if cnt and 1{ if cnt and 2:mes cnt } loop
こういうことだと思います



Y_repeat

リンク

2021/5/7(Fri) 14:50:44|NO.92767

こういう書き方もあります
elseがややこしくなるんですけど

repeat 4 if (cnt&1):if (cnt&2):mes cnt loop mes "////////////////////////////////" repeat 4 if (cnt and 1):if (cnt and 2):mes cnt loop



Y_repeat

リンク

2021/5/7(Fri) 22:08:03|NO.92775

if hoge:if piyo
って記述はクックブックで使ってました
他には

a = 10 a+ mes a a++ mes a // +a error // ++a error b = 10 b- mes b b-- mes b // -b error // --b error
こういうことみたいです



mikoto

リンク

2021/5/9(Sun) 09:57:10|NO.92791

返信が遅くなりましたがY_repeatさん、お答えいただきありがとうございます。
わたくしは、システム変数のstat、refstr、refdvalを使ったことがなかったのですが
return命令に数値、文字列、実数値のいずれかを指定した後に使うようですね。ためになりました。

それとY_repeatさんが書き込んだソースコードを見てみましたが今まで知らなかった書き方なので
新鮮でした。ありがとうございます。



Y_repeat

リンク

2021/5/10(Mon) 02:21:24|NO.92806

遅くなりましたが解説するとですね
3&1は1で3&2は2でビットが違うのでビット演算&の結果は0になるんですね
ただ1も2も0ではないのでifを繋げると真になります
a+とb-といった書き方もクックブックに載ってました
珍しいなあと思ってました
++aや--bがerrorなのは今回、改めて試して気付きました

ハイ。自分、雑魚のくせに調子こいてますね。
どうもすみません



mikoto

リンク

2021/5/11(Tue) 16:24:24|NO.92823

Y_repeatさん、教えて頂きありがとうございます。
ビット演算は使ったことがないので自分で調べてみます。



mikoto

リンク

2021/5/11(Tue) 16:29:12|NO.92824

わたくしは、ビット演算というのに疎いので調べてみます。
あと、Y_repeatさん、ハイテンションなのは良いですが、疲れずに氣をつけてください。



mikoto

リンク

2021/5/11(Tue) 19:16:26|NO.92825

みなさん、教えてくださりありがとうございました。
とりあえず、解決とします。



Y_repeat

リンク

2021/5/19(Wed) 01:10:29|NO.92902

解決されたとのことですが
こういう関数を作って使うと便利っす


#define true 1 #define false 0 #module #defcfunc is_true int p if p == 0:return 0 return 1 #defcfunc l_and int p1,int p2,local loc1,local loc2 loc1 = is_true(p1) loc2 = is_true(p2) return loc1 && loc2 #global repeat 4 if is_true(cnt&1) && is_true(cnt&2){ mes cnt } loop mes "/////////////////////////" repeat 4 if l_and((cnt&1),(cnt&2)):mes cnt loop

せっかくなので自分の投稿をまとめました
http://zuzazann.main.jp/wiki153_b/?for_hsp_beginner



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