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


HSPTV!掲示板


未解決 解決 停止 削除要請

2022
0818
UNGA「elseの前にifが見当たりません」というエラーについて11解決


UNGA

リンク

2022/8/18(Thu) 09:07:58|NO.96968

次のスクリプトで、最後のelseの部分で「elseの前にifが見当たりません」というエラーが出ます。
文法的には間違っていない気がするのですが、お気づきの点がありましたら教えてください。
HSPのバージョンは3.6です。


if (imgname_!="") { bgscr 2,xsize,ysize buffer 3 : picload imgname_ w_size=ginfo_winx h_size=ginfo_winy gsel 2 if w_size>xsize { xx=xsize yy=h_size*xsize/w_size } else { xx=w_size yy=h_size } if yy>ysize { yy=ysize xx=xx*ysize/yy } px=(xsize-xx)/2 py=(ysize-yy)/2 pos px,py // color 0,0,0 // boxf 0,0,xsize,ysize gzoom xx,yy,3,0,0,w_size,h_size gsel 2,1 } // color 255,255,255 else { end }



この記事に返信する


あかねこ

リンク

2022/8/18(Thu) 09:30:26|NO.96970

最後のelseの前に以下のコメントがあるからだと思います。
// color 255,255,255
これを削除すればいいのでは?



アキアキノヒロロ

リンク

2022/8/18(Thu) 16:15:18|NO.96973

読込み画像を縦横比率を変えずに、画面中央に表示するプログラムのようですね。

[else] は、

> if a=b {......} else {......}
> if a=b : ...... : else : ......

のように記述し、

『} else』か『: else』と続けた組合せの記述で、[else] は、次の意味になる、と理解しています。

> if a!=b {
> if a!=b :

なので、『}』や『:』と、『else』の間は、改行やスペース以外は使えないと思います。
	if (imgname_!="") {
...... } // color 255,255,255 else { end }
ここは、『color 255,255,255』をコメントとして残すなら
	if (imgname_!="") {
...... } else { // color 255,255,255 end }
最後の[end]は、[stop]にした方が結果が分かりやすいですね。



窓月らら

リンク

2022/8/18(Thu) 17:37:56|NO.96974

既に回答出てますが、その書き方の場合は else の前にコメント行は書けません。
		else { end }	// color 255,255,255

これなら可。



とっしー

リンク

2022/8/18(Thu) 18:41:16|NO.96975

最初のifの「{}」閉めるの忘れてます。elseの前に行を開け「}」を追加してみたらいけると思います。



メルクーフ

リンク

2022/8/18(Thu) 19:27:04|NO.96976

 理屈はよく分かりませんが、

gsel 2,1 }// color 255,255,255 else { end }
とすればエラーは出ません。

> NO.96975 とっしーさん
 このスクリプトだと分かりづらいですが、26行目の“}”(25行目のgsel 2,1の下)が最初のifの“}”です。



GENKI

リンク

2022/8/18(Thu) 21:25:55|NO.96977

読みにくかったので、ブロック内だけにインデントをつけて整形してみました。
しかしあまり意味はなかったかも。

if (imgname_!="") { bgscr 2,xsize,ysize buffer 3 : picload imgname_ w_size=ginfo_winx h_size=ginfo_winy gsel 2 if w_size>xsize { xx=xsize yy=h_size*xsize/w_size } else { xx=w_size yy=h_size } if yy>ysize { yy=ysize xx=xx*ysize/yy } px=(xsize-xx)/2 py=(ysize-yy)/2 pos px,py // color 0,0,0 // boxf 0,0,xsize,ysize gzoom xx,yy,3,0,0,w_size,h_size gsel 2,1 } // color 255,255,255 else { end }
エラーの原因を探す場合は、同じエラーが出る範囲で不要箇所を削除してみるとわかりやすくなります。

if 1 { } else { }
これで再現しました。
elseの上の空行を消すとエラーは出ません。
2行目の}でif文が終了していると認識されているようです。elseは直前の}をさかのぼってまで探してくれたりはしないようです。
マニュアルには明確な記載はないものの、文法違反と理解していいと思います。



アキアキノヒロロ

リンク

2022/8/19(Fri) 02:21:07|NO.96979

> // color 255,255,255
このコメントの意味は、その上のコメント
> // color 0,0,0
> // boxf 0,0,xsize,ysize
に対応しているものですね。

画像がある時は、画面を黒塗りにし、その画像を画面内に収まる大きさにリサイズして、
その画面中央に表示するが、
画像がない時は、画面を白塗りにして、終わりにする。
こういうことだとすると、以下のようになるのでは。
『//』のコメントを有効にしてみて下さい。
	xsize=300 : ysize=200	; 例えばの値です
bgscr 2,xsize,ysize gsel 2,-1 if (imgname_!="") { buffer 3 : picload imgname_ w_size=ginfo_winx h_size=ginfo_winy gsel 2 if w_size>xsize { xx=xsize yy=h_size*xsize/w_size } else { xx=w_size yy=h_size } if yy>ysize { yy=ysize xx=xx*ysize/yy } px=(xsize-xx)/2 py=(ysize-yy)/2 // color 0,0,0 // boxf 0,0,xsize,ysize pos px,py gzoom xx,yy,3,0,0,w_size,h_size gsel 2,1 } else { // color 255,255,255 // boxf 0,0,xsize,ysize // gsel 2,1 stop }
最後の[end]は、やはり[stop]にした方がいいですね。



とっしー

リンク

2022/8/19(Fri) 17:06:35|NO.96981

メルクーフさん、ありがとうございます。
結果こんな感じです。


if (imgname_!="") {
bgscr 2,xsize,ysize
buffer 3 : picload imgname_
w_size=ginfo_winx
h_size=ginfo_winy
gsel 2
        }
if w_size>xsize {
xx=xsize
yy=h_size*xsize/w_size
}
if w_size<xsize {
xx=w_size
yy=h_size
}
if yy>ysize {
yy=ysize
xx=xx*ysize/yy
}
if w_size<xsize {
px=(xsize-xx)/2
py=(ysize-yy)/2
pos px,py
// color 0,0,0
// boxf 0,0,xsize,ysize
gzoom xx,yy,3,0,0,w_size,h_size
gsel 2,1
} else : end
// color 255,255,255



UNGA

リンク

2022/8/19(Fri) 17:39:35|NO.96982

御返事が遅れて申し訳ありません。
コメント行は無視されるものと思い込んでいたのですが、違うのですね。
皆様のお陰で解決いたしました。
親切な方々がたくさんいて、とても嬉しくなりました。
ありがとうございました。



とっしー

リンク

2022/8/23(Tue) 12:28:06|NO.97008

ちなみに、//color 255,255,255の部分は、「{}」の中の部分に入っていても大丈夫でしたよ。



usagi

リンク

2022/8/23(Tue) 20:24:48|NO.97009

ifとは話が違いますが、コメントとしては、
プリプロセス時にコメント行は無視≒空に置き換えになる感じですね。

コメントの挙動について、

#cmpopt ppout 1
でプリプロセス後のファイルが"hsptmp.i"で同じフォルダに書き出されるので、
見てみると分かると思いますが、コメントは空に置き換えられます。

その結果、GENKIさんが仰る通り、else前に空の行が入ってしまい
文法違反になってしまったのかと。


#cmpopt ppout 1 if 1 { // コメント mes "あ" }
↑の出力は↓のイメージです。

if 1 { mes "あ" }

コメント入れる位置の事故防止として、else を{}付きで使うときは、
↓この塊で記入するようにしておくと、コメントの位置に困らないかと思います。

} else {


余談ですが、空に置き換えられるので私は余りやらないのですが、
後で引数を忘れない様に、関数の中にコメント書く人もいますね。
※個人的には行末に// or ;が好き。 

a = "あいうえお" val = strmid(/*元文字*/a, /*開始*/0, /*個数*/8) if 1 /* 正しい時*/ { } else /*間違った時*/ { }
など。



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