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


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
0613
Y_repeatelse:if8解決


Y_repeat

リンク

2020/6/13(Sat) 21:09:07|NO.90760

HSPでelseifを使いたい時に
onitamaさんが、else:ifでも多分大丈夫と
かなり前に発言されてた気がするんですが
自分は微妙に不安で使ってなかったんですが
現在ではelse:ifという書き方の信頼性は
どんなかんじなのでしょうか?

って考えて

a=5 while 1 if a == 4{ mes "if" _break } if a == 5{ mes "elseif" _break } if 1{ mes "else" _break } await 1 wend
みたいな書き方でも動作は同じな気がしてきました



この記事に返信する


あらや

リンク

2020/6/14(Sun) 05:10:39|NO.90767

私的な意見ですが
私が使った限りでは今のところ『else:if』で不具合が生じた事はありません。

人によってはマクロ化して下記のように『elseif』を使っている人がいたような。。。?

#define elseif else:if



Y_repeat

リンク

2020/6/14(Sun) 11:24:29|NO.90771

こんにちわ
解答ありがとうございます→あらや様

大丈夫そうなんですね

でも逆に上手くいかないケースがあれば
過去レスになっても資料になるかなと



ウンチョコレートカカオ

リンク

2021/2/22(Mon) 14:14:27|NO.92316

ループで囲うのは逆によくなさそうですけど…。



Velgail

リンク

2021/2/24(Wed) 22:33:36|NO.92341

else:ifが「多分大丈夫」なのは、else:ifを多用する場合、

if(){ }else{ if(){ }else{ if(){ } } } }
みたいな感じになって、条件式のネストが深くなりがち(もしかすると上限が低めだったりする?)ということかと思われます。

なので、本当に大量のelse:ifを使う場合、switch-case文で出来ないか確認してということかなと。

余談ですが、C++でelse if()と書いているとき、HSPのelse:ifと同じような文構造をしています。
そのため、この書き方自体が何か特殊ということではないです。



沢渡

リンク

2021/2/26(Fri) 17:45:27|NO.92353

switch構文で使われる命令は実際はマクロなので、
ちょっとだけ改造してみました。
これでスレ冒頭のコードと同じようなことができるかもしれません。

/* 改造版switch構文 使い方は基本的には通常のswitch構文と同じですが、 ・switch2の後には変数は指定しない。 ・case2の後には条件式を指定し、条件式を満たしているならそれ以下を実行する。 ・swbreak2、default2、swend2は標準のswbreak、default、swendを使っても構わない。 */ #define global switch2 %tswitch %i0 %i0 if 0 { #define global case2(%1) %tswitch _switch_sw++} if (%1) | _switch_sw { _switch_sw = 0 #define global swbreak2 swbreak #define global default2 default #define global swend2 swend //以下、使用例 a=1 //これだけをコメントアウトすると"b=1"と表示される。 b=1 //これと↑の両方をコメントアウトすると"none"と表示される。 switch2 case2 a=1 mes "a=1" swbreak2 case2 b=1 mes "b=1" swbreak2 default2 mes "none" swbreak2 swend2



X

リンク

2021/2/27(Sat) 00:16:18|NO.92363

else : if は正確には覚えていませんが確か120いくつか辺りでネストの深さでエラーが出たと思います。
ただ沢渡様もおっしゃっているようにマクロで誂えただけの微妙なものでしかないので分岐が4つほどまでならともかく
10辺りもしくは増えれば増えるほど速度を考慮するならif文と同等かそれ以下になります。
if + gotoのほうがマシなくらいの速度差になるかと。
if文の連打はかっこ悪いですがエラーにはならないので…。

ちなみにon命令でのジャンプならswitchや if + else : if の5倍から7倍ほど、ラベル変数 + varuseだと10倍から12倍(以上)ほど速度差が出ますので
ラベルを用意する手間が気にならないのであれば本来想定されるswitchの動作を行うので最速になります。

文字列は連想配列プラグインのメモリリークが治っていないっぽいので仕方ないところですが
int型のジャンプは標準命令で用意することを検討いただいても良いほどのパフォーマンスの差とは思えます。



とっしー

リンク

2021/3/1(Mon) 17:59:01|NO.92375

else : if でもだいじょうぶですよ



Y_repeat

リンク

2021/3/13(Sat) 21:09:28|NO.92468

ウンチョコレートカカオ様
Velgail様
沢渡様
X様
とっしー様
回答ありがとうございました
解決忘れてましたw



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