◆ HSP3.0a 版のバグ?

[Top] [投稿ルール] [新規質問] [このトピックに発言]
投稿者:ぷま [HomePage]  投稿日:2005/09/12(月) 17:17:44 No.1



このスレッドは 「HSP3リリース版のバグ?」からの続きです。
http://smile.poosan.net/perl-bin/hsp/ver3/hsp3.cgi?print+200508/05080001.txt

HSP3.0a 版で たくさんのバグが修正されています。

HSP3.0a 版で気がついた内容です。
だんだん しょうもない内容になってきました。(^^;

44)onerror gosub /gotoで 戻る位置が おかしい(エラーをskipしない 2.61はOK)
無限ループになったり、終了したり。。。
onerror gosub *load_err

	repeat 10
		fn="aaa"+cnt
		picload  fn
		await
	loop
	stop
*load_err
	mes fn
	return



45)関数で 数値が文字列として扱われる。
#define ctype tasizan(%1,%2)%1+%2	;関数タイプ 足し算
	a=3 :b=7
	mes ""+a+"+"+b+"= "+ tasizan(a,b)		;コレ おかしいのでは?

	mes ""+a+"+"+b+"= "+ (tasizan(a,b))		;関数は括弧付きと同じ扱いにすべき
	mes ""+a+"+"+b+"= "+ 1*tasizan(a,b)		;掛け算優先にすべきでは?


46)font命令で 意味無しstatが返る。
	dirlist buf,"*.*"
	mes stat
	font "MS ゴシック",16
	mes stat


47)次のウィンドウ作成時パレットが更新される(picload p1=0含む)
パレットを更新しない状態で、新しいウィンドウだけがパレットが
反映されているという謎の現象になります。
反映されたり、されなかったり ややこしいので paletteは 常に1(更新)にしては?
やりたくないでしょうが。。。256回API呼んでも 1〜2mSecの差でしかないので。。。(^凹^;


48)mref pl,69(パレット情報)が gselで選んだウィンドウと一致していない。
(最後に作成したパレット情報になっています。
ウィンドウ毎に持っていない構造体。ヘルプ対応しておいた方がヨイ)

#include "hsp3util.as"
#define global palfade palcolor: palette ,ginfo.16,ginfo.17,ginfo.18, 1

screen 0,,,1
	fn=dir_exe+"/sample/demo/jp6girl.bmp"
	bmppalette fn   :palfade
	color 255,255,255:boxf
	picload fn,1
	mref pl,69 :dim c,256 :	memcpy c,pl,768
	sx=ginfo_winx	:sy=ginfo_winy
screen 1,,,1

	fn=dir_exe+"/sample/hspdx/TESTCHR.BMP"
	bmppalette fn   :palfade
	color 255,255,255:boxf
	picload fn,1

gsel 0,1
	mref pl,69				;これは screen 0 のパレットでなく screen 1のパレットです
	dim c,256 :	memcpy c,pl,768
screen 2,,,1
	mref pl2,69
	memcpy pl2,c,768 :palfade

	fn=dir_exe+"/sample/demo/jp6girl.bmp"
	color 255,255,255:boxf
	picload fn,1

	repeat  256
		palcolor cnt
		mes ""+ginfo_r+", "+ginfo_g+", "+ginfo_b
	loop



49)ひとつひとつの処理が遅くなった。 (2.61比 1.2〜1.6倍)
少しでも 高速化するための施策を。

50) memfile ヘルプ 説明がヘン(日本語)です。
また、picloadは 拡張子による判別は行っていないので、
picload "MEM:に続く文字は無意味になっています。(ヘルプ側を修正)

投稿者:月影とも [HomePage]  投稿日:2005/09/13(火) 05:04:18 No.2

> 44) onerror gosub /gotoで 戻る位置が おかしい(エラーをskipしない 2.61はOK)
最初 ぷましゃんのスクリで "aaa0"が2回出てたんですよね、
で、なんでかなーと思ったら、loopのとこで、
repeat してないのに loop された というようなエラーが出てるのですよ。
デバッグ窓眺めてて気づいたんですが、
エラーの飛び先からreturnするとcntやlplevが0になってるのが「???」
onerror gosub *load_err
	repeat 5,2
		mes "(inloop1) cnt:"+cnt+" lplev:"+looplev
		picload "aaa"+cnt
		mes "(inloop2) cnt:"+cnt+" lplev:"+looplev
	loop
	stop
*load_err
mes"ERR line:"+wparam +"  err:"+lparam
mes "   (err) cnt:"+cnt+" lplev:"+looplev
return

> 無限ループになったり、終了したり。。。
え、と……この例では必ず以下の出力で止まる……?
(inloop1) cnt:2 lplev:1
ERR line:13  err:4
   (err) cnt:2 lplev:1
(inloop2) cnt:0 lplev:0
ERR line:11  err:6
   (err) cnt:0 lplev:0

picload の行を x=1/0 にしたら、確かに無限ループに……おぉ。。

> 45) 関数で 数値が文字列として扱われる。
#define は関数のように振舞っても、結局「文字列マクロ」なのだから、
言語的にはそれで正しい動作、のような気はしていますが。
> mes ""+a+"+"+b+"= "+ tasizan(a,b)
展開すれば当然 mes ""+3+"+"+7+"= "+ 3+7 で?

> mes ""+a+"+"+b+"= "+ 1*tasizan(a,b) ;掛け算優先にすべきでは?
展開すると mes ""+a+"+"+b+"= "+ 1*a+b
変数が評価されて mes ""+3+"+"+7+"= "+ 1*3+7
なので、 1*a が評価されて mes ""+3+"+"+7+"= "+ 3+7
結果 mes "3+7= 37" ちゃんと掛け算優先されてる、よね……?
って、そういう上辺の話ではないのだとは思いますが。

#define ctype tasizan(%1,%2) (%1+%2)
カッコで囲んであった方が利用しやすいといえばそうかもしれないですが……。
マクロは必ずカッコで囲むべきものとしてる自分はどうも……。
そう言えば%1系のパラメータも、演算子の優先順序を考えてカッコで囲む必要が出てくるんですね。
#define ctype tasizan(%1,%2) ((%1)+(%2))
これが正解ですね。
Cで慣れてるのであまり気になっていなかったんですが、確かに煩わしいと言えば煩わしいかも……。

> 47) 次のウィンドウ作成時パレットが更新される(picload p1=0含む)
新しくウィンドウを作った場合のパレットが直前に使っていたものと同じになるのは
「なんか微妙だ」と思いながら仕様だと思っていたんですが……。
「確かに画像のコピー用には便利なのかなぁ……」とか。うーん。
作ったウィンドウに反映してないパレットが適用されるっていうのは、、うーん。。

投稿者:ぷま [HomePage]  投稿日:2005/09/14(水) 17:40:35 No.3

ともしゃん またまた しぇんきゅう!!(≧▽≦)ノ

>mes "3+7= 37" ちゃんと掛け算優先されてる、よね……?
>って、そういう上辺の話ではないのだとは思いますが。
んと。。。
HSP2x時代は 前からの演算なので そういう展開で 構わないと思いますが、
HSP3xになって title ""+(3+7) っと こういうこともできる新時代となった。。。
#define ctype tasizan(%1,%2)%1+%2
	a=3: b=7
	title ""+tasizan(a,b)

tasizanは 10になることを期待して作られたマクロなので、()を付けなくても
別空間扱いで ()を付けたのと同じ扱いで "10"になって欲しいと思うのです。
マクロには()を付けなさい、%2にも付けないとなりません。
いちいち初心者さんに そんなワケの分からない説明を しなくても
直感的に使える仕様にする。HSPは そうあるべきだと思うのであります。(^-^;ゞ

そんで。。。これ 文法あってるのかな。。。?(^◇^;
#define AddName(%1,%2,%3) %1%2%3=(%1+%2+%3)

	a=3 : b=7 : c=20
	abc=0
	
	AddName a,b,c	:mes abc


>作ったウィンドウに反映してないパレットが適用されるっていうのは、、うーん。。
palcopyを無くしてオートマチックにしたのはいいことだと思います。
アトはpaletteを更新しないモードなんてのを無くせば。。。ややこしくなくていい?

投稿者:月影とも [HomePage]  投稿日:2005/09/15(木) 01:46:06 No.4

もちろんそういう話だろうと思っていたのですが、まぁ、確かに。
あらかじめカッコで囲んでくれたほうが、マクロを書く側も楽かもですし?
というか、AddNameのようなことはできなくてもいいですよね。

ただ、単純にカッコで囲んじゃうと(引数が式だと仮定すると)
変数が変数のまま指定できなくなりませんかね。
カッコで囲むのはctypeが付いてるときだけにする、とかですか。
うーん、それも中途半端な仕様なような。難しいorz

#define LetMul(%1,%2,%3) %1 = %2 * %3
a=3 : b=7
LetMul x, a+b, a
mes x


……もちろん、 x=Mul(a+b, a) のような形式で書かせればいいのかもしれませんが。。
変数を変数のまま使いたいときは#deffunc定義ってことに、なっちゃいますかね、やっぱ。
a = 5 : mes lpeek((a),0); がちゃんと動くのにはびっくりしたのですが。。
すると、、全部カッコで囲んじゃった方がいいのかなって感じですね。

パレットは、256回API呼んだっていいじゃないですか、と自分も思います。

投稿者:ぷま [HomePage]  投稿日:2005/09/15(木) 12:30:34 No.5

>パレットは、256回API呼んだっていいじゃないですか、と自分も思います。
現在、パレットの更新処理は APIを呼ぶ以外にパレット構造体(mref pl,69)の
$RRGGBBの形式を $00BBGGRRに変換して BMSCR.9の先(*pal)に1KBコピーする
という作業も毎回行われているようです。

こういうことがあるので 常に更新するとなると 256KBの処理になるので、
なんとなく気分的に重い処理になってしまうため、
今の仕様になっていると思うのですが。。。

しかし、このデータ(*pal)というのは パレットモード時のbmpsaveのときの
ヘッダ用としてしか参照されないと思うので、パレットの更新処理からは
ハズして 256bmpsaveの直前に1回だけやるようにすれば ヨイのでは?
っと思うのですが。。。っということで ともしゃん そうすっぺ 。(^O^)

投稿者:月影とも [HomePage]  投稿日:2005/10/07(金) 23:13:00 No.6

既出で見落としてたら申し訳ないです。
今日cnt値を描画座標のオフセットに取るような命令を書いていて気づいたのですが
repeat命令で p1>0 のとき p1+p2 == -1 だと無限ループに落ちますね。
repeat 1,-2
mes cnt
loop


投稿者:ぷま [HomePage]  投稿日:2005/10/11(火) 12:48:35 No.7

repeatのp2は 0〜なので問題無いのでわ?

投稿者:月影とも [HomePage]  投稿日:2005/10/11(火) 22:08:46 No.8

確かに0〜って書いてありますね(;ω;
屁理屈こねると、じゃあ 1〜とかかれたp1の初期値である-1も何だかな。
誰もが思うかも知れませんが、ループは任意の値で実行できた方が便利かなぁとか。
repeat 0 も含めて。……まぁ、あの、なかったことにしておきますorz

投稿者:ぷま [HomePage]  投稿日:2005/11/10(木) 12:58:22 No.9

51) ウィンドウを非表示モードで作成しても、picloadで表示されてしまう。
screen 0,,,2				;ウィンドウ非表示のハズが。。。
	wait 100
	
	picload dir_exe+"/sample/demo/jp6girl.bmp"	;picloadで表示されてしまう
	;gsel 0,1


投稿者:TAKE  投稿日:2005/12/27(火) 17:04:14 No.10

52)デスクトップが16ビットだと gmode 2がバグるようですね。(本家掲示板より)
(color 1,1,1でも透過してしまう。)

投稿者:さとみ  投稿日:2005/12/27(火) 17:14:47 No.11

(・__・)ノTAKEしゃん報告の 52)番ですが
HSP3rc1のバグ?
http://smile.poosan.net/perl-bin/hsp/ver3/hsp3.cgi?print+200507/05070015.txt
の 1)番と重複しています。(^^;報告済み。
それがなおれば なおるはずです。

投稿者:TAKE  投稿日:2005/12/27(火) 17:28:14 No.12

>1)番と重複しています。
さっそくの つっこみ ありがとうございます。(^□^*;;
スレが だいぶ 下になったので 上げようと思ったら しっぱいしっぱい。

投稿者:ぷま [HomePage]  投稿日:2005/12/28(水) 13:17:50 No.13

バグでは ありませんが。。。
gmode 0以外の gcopyで 自分のウィンドウ内の画像 その右側(または下側)に
コピーすると。。。 大量にコピーされる。へぇ〜っ!へぇ〜っ!へぇ〜っ!
buffer 1,,,0
	picload dir_exe+"\\sample\\demo\\efx.bmp"
	sx=ginfo_sx : sy=ginfo_sy
	
screen 0,,,0
	color 255 : boxf
	gmode 3,,, 247
	gcopy 1, 0, 0, sx, sy			;1個コピー

	pos sx, 0 : gcopy 0, 0, 0, ginfo_sx-sx, sy			;大量生産
	pos 0, sy : gcopy 0, 0, 0, ginfo_sx, ginfo_sy-sy	;大量生産


投稿者:月影とも [HomePage]  投稿日:2006/01/10(火) 18:58:22 No.14

53) wait中に割り込むと、正確に時間待ちされない。
イベントが発生すると残ってる時間分が無視されてプログラムの実行が再開される。
await 1000だともう少しおかしなコトに……

#uselib "winmm.dll"
#cfunc timeGetTime "timeGetTime"

onclick gosub *c
repeat
    mes "time:"+timeGetTime()
    wait 100
loop

*c
	return


実害が思いつかないので
バグというほどのものでもないような気はしますが、
気づいてしまったので一応。

投稿者:ぷま [HomePage]  投稿日:2006/04/05(水) 08:38:52 No.15

解決!!(≧▽≦)
このスレは「hsp31b2のバグ?」に移動します。
http://smile.poosan.net/perl-bin/hsp/ver3/hsp3.cgi?print+200604/06040001.txt

追加発言 [▲]
お名前 (必須)
パスワード(必須)下の「記事 修正/削除フォーム」で修正、削除ができます。
Eメール (非推奨)
ホームページ (任意)

発言 (エラー時再送信禁止)
・1行が長い場合、右端で折り返しします。適度に改行を入れてください。
スクリプトは小文字の <pre>〜</pre> で囲んでください。 詳細説明
顔文字(^^) スパムと誤認識されたら

←解決時は質問者本人がここをチェックしてください。     [File upload]
送信前に 今一度 誹謗・中傷と勘違いされるような内容など含まれていないか お確かめください。


記事 修正/削除フォーム
 処理  記事No  パスワード

WwwLounge Ver2.16
Arranged by puma

無料ホームページ ブログ(blog)