moduleにしてみる
#module
//memset_ex %1,%2,%3,%4
//%1=変数 : 書き込み先の変数(ラベル型 文字列型 実数型 整数型が使用できる)
//%2=型による : クリアする値
//%3=0〜(0) : クリアするサイズ(文字列はバイト単位、他は要素数)
//%4=0〜(0) : 書き込み先の変数メモリオフセット(文字列型はバイト単位、他は要素単位)
#define global memset_ex(%1,%2=0,%3=0,%4=0) _dat@_tmp=%2 :_memset_ex %1,_dat@_tmp,%3,%4
#deffunc _memset_ex array a,var dat,int c,int s
vt=vartype(a)
if vt=2{//sdim用
memset a,peek(dat),c,s
}else{
//書き換え数値(開始位置に最初から書き込んどく) :最初の書き換えバイト数
if vt = 3 {a(s)=double(dat) : siz=8}else{lpoke a(s),0,lpeek(dat) :siz=4}
b=(c-1)*siz //書き換えバイトサイズ(最初に一つ書き換えてるから-1)
if b > 0 {
repeat
b-siz
if b > 0{
memcpy a(s),a(s),siz,siz //書き込んだのを利用して倍々にコピーしていく
}else{
memcpy a(s),a(s),siz+b,siz //半端な残りをコピー
break
}
siz*2 //書き込みサイズと書き込み先オフセット
loop
}
}
return
#global
ddim a,300
//使い方はmemsetと同じ書き込み先の変数の型に応じてクリア(クリアするサイズが0でも指定要素を書き換えるが・・・)
memset_ex a,98.12,100,15
repeat length(a)
pos (cnt/25)*50,(cnt\25)*16
mes strf("%5.2f",a(cnt))
loop
sdim b,100
memset_ex b,"A",50,0
dat='B'
memset_ex b,dat,50,50
pos 0,420
mes b