|
|
2016/8/16(Tue) 01:47:37|NO.76617
デバッグ用のダイアログ、ダイアログを書き込んだソースの行とソースファイル名を表示します
#undef dialog
#module
#define global dialog(%1="",%2=2,%3="") : dialog2 str(%1),%2,str(%3),__line__,__FILE__
#deffunc dialog2 str _p1,int _p2, str _p3, int _line, str _file
dialog@hsp "ソースファイル:"+_file+"\n行:"+_line+"\n-----------------------------\n"+_p1,_p2,"デバッグモード"+_p3
if _p2=2 & stat=7:end
return
#global
|
|
2016/8/20(Sat) 18:42:09|NO.76665
多次元文字列型配列の直列化と復元
しょうもないモジュールだが、これで多次元文字列型配列をファイルに保存できるようになる。
↓本体
#module MS_misc_0
/*
serializeStrArray
[機能]
文字列型配列の直列化
[書式]
serializeStrArray strArray, text
strArray : 直列化したい文字列型配列
text : 変換結果の格納先変数
[実行後のstatの値]
正常終了 : 0
異常終了 : 1
*/
#deffunc serializeStrArray array strArray, var text
if (vartype(strArray)!=vartype("str")) : return 1
l=length(strArray),length2(strArray),length3(strArray),length4(strArray) //l(i) : 第i次元の長さ
nd=0 : repeat 4 : if (l(cnt)!=0){nd++}else{break} : loop //意味のある次元の数
if (nd==0) : return 1
/*
直列化データのフォーマット
text = "nd,l1,l2,l3,l4,l[0,0,0,0],str[0,0,0,0],l[0,0,0,1],str[0,0,0,1], ... ,l[a-1,b-1,c-1,d-1],str[a-1,b-1,c-1,d-1]"
l1,l2,l3,l4 : 第1,2,3,4次元長さ
l[x,y,z,w] : 第(x,y,z,w)要素の文字列のバイト長
str[x,y,z,w] : 第(x,y,z,w)要素
但し、例えば nd=2 の様にフル次元でない場合(そういう場合が殆ど)は長さ0の次元に関するデータは書き込まない。
この場合、l3,l4 は書き込まれないし、l[0,0,0,0]やstr[0,0,0,0]も書き込まれない。
*/
sdim text,64
text+=str(nd)+"," : repeat nd : text+=str(l(cnt))+"," : loop
repeat l
if (nd==1) {text+=str(strlen(strArray(cnt)))+","+strArray(cnt)+","} else {
cnt0=cnt
repeat l(1)
if (nd==2) {text+=str(strlen(strArray(cnt0,cnt)))+","+strArray(cnt0,cnt)+","} else {
cnt1=cnt
repeat l(2)
if (nd==3) {text+=str(strlen(strArray(cnt0,cnt1,cnt)))+","+strArray(cnt0,cnt1,cnt)+","} else {
cnt2=cnt : repeat l(3) : text+=str(strlen(strArray(cnt0,cnt1,cnt2,cnt)))+","+strArray(cnt0,cnt1,cnt2,cnt)+"," : loop
}
loop
}
loop
}
loop
poke text, strlen(text)-1, 0 //末尾の余計な","を消す
return 0
/*
deserializeStrArray
[機能]
直列化データから文字列型配列を復元
[書式]
deserializeStrArray strArray, text
strArray : 復元先文字列型配列
text : 直列化データ
[実行後のstatの値]
正常終了 : 0
異常終了 : 1
*/
#deffunc deserializeStrArray array strArray, var text
sdim buf,64
getstr buf,text,0,',' : rc=strsize : nd=int(buf) //rc : readCounter
if (nd==0) : return 1
flg_error=0
repeat nd
getstr buf,text,rc,',' : rc+=strsize : l(cnt)=int(buf)
if (l(cnt)==0) : flg_error=1 : break
loop
if (flg_error) : return 1
sdim strArray, 64, l,l(1),l(2),l(3)
repeat l
if (nd==1) {gosub *getElement : strArray(cnt)=buf} else {
cnt0=cnt
repeat l(1)
if (nd==2) {gosub *getElement : strArray(cnt0,cnt)=buf} else {
cnt1=cnt
repeat l(2)
if (nd==3) {gosub *getElement : strArray(cnt0,cnt1,cnt)=buf} else {
cnt2=cnt : repeat l(3) : gosub *getElement : strArray(cnt0,cnt1,cnt2,cnt)=buf : loop
}
loop
}
loop
}
loop
return 0
*getElement //1要素読み出してbufに格納
getstr buf,text,rc,',' : rc+=strsize : ls=int(buf) //文字列長
buf = strmid(text,rc,ls) : rc+=ls+1 //getstrは使わない
return
#global
↓サンプル
randomize
sdim strArray, 64, 2,2,2
sdim text,64
buf = ""
repeat 2
cnt0=cnt
repeat 2
cnt1=cnt
repeat 2
poke buf,0,limit(32,rnd(126),126)
strArray(cnt0,cnt1,cnt)=buf
mes "strArray("+str(cnt0)+","+str(cnt1)+","+str(cnt)+") = "+buf
loop
loop
loop
serializeStrArray strArray,text
mes "\n直列化 -> "+text
sdim strArrayB
mes "\nstrArrayBに復元\n"
deserializeStrArray strArrayB,text //復元
repeat 2
cnt0=cnt
repeat 2
cnt1=cnt
repeat 2
mes "strArrayB("+str(cnt0)+","+str(cnt1)+","+str(cnt)+") = "+strArrayB(cnt0,cnt1,cnt)
loop
loop
loop
![](../images/bbs/mark_main_g.gif)
| |
|
2016/10/9(Sun) 11:51:13|NO.77069
ビットマップを正確に90,180,270度回転するサンプル。
ゲームなんかだと1pxの誤差にうるさくなることもないが、ツール系では1pxの誤差が致命傷になることもあろう。
grotateでは誤差が出るから PlgBlt を使うことにする。
/*--------------------▼ module ▼--------------------*/
#ifndef NULL
#define global NULL 0
#endif
#ifndef DONTCARE_INT
#define global DONTCARE_INT 0
#endif
#module mdraw2D_0
#uselib "gdi32.dll"
#func PlgBlt "PlgBlt" int, var, int, int,int, int,int, int, int,int
#deffunc rotBmp90DegStep_PlgBlt int widSrc_, int xSrc_,int ySrc_, int sx_,int sy_, int deg_
/*
PlgBltを利用してビットマップを+90度の整数倍回転してコピーする。
コピー先は現在選択されているウィンドウ。貼り付け先左上座標はカレントポジション。
widSrc_ : コピー元ウィンドウID
xSrc_,ySrc_ : コピー元左上座標
sx_sy_ : コピーする縦横サイズ
deg_ : 回転角度。90,180,270 のいずれか。
[備考]
コピー元とコピー先が重なる場合の動作は未定。
コピー先でredrawは行わない。
*/
assert ((sx_>0)&&(sy_>0))
hdcDst=hdc : wid_sel=ginfo_sel : gsel widSrc_ : hdcSrc=hdc : gsel wid_sel
switch deg_
//量子化誤差を補償するために座標指定がcrazy
case 90 : point=ginfo_cx+sy_,ginfo_cy, ginfo_cx+sy_,ginfo_cy+sx_, ginfo_cx,ginfo_cy : swbreak
case 180 : point=ginfo_cx+sx_-1,ginfo_cy+sy_-1, ginfo_cx-1,ginfo_cy+sy_-1, ginfo_cx+sx_-1,ginfo_cy-1 : swbreak
case 270 : point=ginfo_cx,ginfo_cy+sx_, ginfo_cx,ginfo_cy, ginfo_cx+sy_,ginfo_cy+sx_ : swbreak
default assert
swend
PlgBlt hdcDst, point, hdcSrc, xSrc_,ySrc_, sx_,sy_, NULL, DONTCARE_INT, DONTCARE_INT
return
#global
#undef NULL
#undef DONTCARE_INT
/*----------------------------------------*/
/*--------------------▼ sample ▼--------------------*/
*macros
#define global ctype RGB(%1,%2,%3) ((%1)<<16|(%2)<<8|(%3))
#define global rgbcolor(%1) color (%1)>>16,((%1)>>8)&0xFF,(%1)&0xFF
*mkwnds
#define WID_MAIN 0
#define SX_MAIN 800
#define SY_MAIN 800
#define SX_PICT 400
#define SY_PICT 400
#define X_PICT 0
#define Y_PICT 0
#const BGCOLOR_PICT RGB(50,50,50)
#const CHRCOLOR_PICT RGB(255,128,64)
#define X_DST_COPY X_PICT+SX_PICT
#define Y_DST_COPY Y_PICT+SY_PICT
screen WID_MAIN, SX_MAIN,SY_MAIN
rgbcolor BGCOLOR_PICT : boxf X_PICT,Y_PICT, X_PICT+SX_PICT-1,Y_PICT+SY_PICT-1
font msgothic,SY_PICT
rgbcolor CHRCOLOR_PICT : pos X_PICT,Y_PICT : mes "あ"
pos X_DST_COPY,Y_DST_COPY : rotBmp90DegStep_PlgBlt WID_MAIN, X_PICT,Y_PICT, SX_PICT,SY_PICT, 270 : redraw 1
/*----------------------------------------*/
![](../images/bbs/mark_main_g.gif)
| |
|