|
|
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の“}”です。
|
|
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
|
|
2022/8/19(Fri) 17:39:35|NO.96982
御返事が遅れて申し訳ありません。
コメント行は無視されるものと思い込んでいたのですが、違うのですね。
皆様のお陰で解決いたしました。
親切な方々がたくさんいて、とても嬉しくなりました。
ありがとうございました。
|
|
2022/8/23(Tue) 12:28:06|NO.97008
ちなみに、//color 255,255,255の部分は、「{}」の中の部分に入っていても大丈夫でしたよ。
|
|
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 /*間違った時*/ {
}
など。
|
|