|
|
2007/12/2(Sun) 21:50:30|NO.12688
MAP用に、2次元配列MAPを作るのですが、たとえば、
dim map,30,30
と指定すると、mapの配列変数の中身はみんな0になります。
そこで、配列変数mapの中身を、たとえば、1の数字で全部埋めたいのです。
調べてみると、memset命令を使えばいいみたいですが、ヘルプの説明書を呼んでも、恥ずかしい話、さっぱり分かりません。
こうだと思って書いても、うまく配列変数すべてに同じ数字を入れるどころか、エラーばかりおきます。
申し訳ないですが、誰か、配列変数に0以外の特定の数字を入れる方法を教えてください。
|
|
2007/12/2(Sun) 23:03:49|NO.12689
repeat〜loop命令ではダメなのですか?
|
|
2007/12/3(Mon) 21:25:08|NO.12696
memsetはbyte単位の命令だろ。整数の1クリアは無理なんでね?
16843009とか33686018とか-1とか文字の1とかなら出来るだろうが。
整数は4bytesあるからな。
01,00,00,00, 01,00,00,00, 01,00,00,00....とクリアしてやる必要がある。
素直にrepeat〜loop使えば良いんでね。
|
|
2007/12/3(Mon) 21:47:30|NO.12697
GENKIさん、返答ありがとうございます。
配列の要素数が少なければ、repeat〜loop命令でもいいのですが、今作っているのは(30,30)では、足りないような大きいものなので、repeat文では時間がかかる可能性があるんです。
memset命令は、
memset p1,p2,p3,p4
p1=変数 : 書き込み先の変数
p2=0〜255(0) : クリアする値(1byte)
p3=0〜(0) : クリアするサイズ(1byte単位)
p4=0〜(0) : 書き込み先の変数メモリオフセット
とありますが、自分が思っているように、動いてくれません。
たとえば、
dim dat,4
として、
memset dat,1,16,0
を実行すると、
配列変数には、
16843009
の数字が、各配列変数に代入されます。
なぜ、1が入らないのでしょう?
|
|
2007/12/3(Mon) 21:54:09|NO.12698
なんか、もたもた書いているうちに、fさんが答えを書き込んでくれていました。
fさん、ありがとうございます。
そうですか、repeat〜loopしかないですか・・・
いろいろご迷惑かけてすみません。
|
|
2007/12/4(Tue) 01:01:24|NO.12703
他人の受け売りですが、memcpyを使う手もあるようです。
a=1,2,3
dim b,3
memcpy b, a,3*4
repeat 3
mes b(cnt)
loop
こんな感じでいいのかな?初めて使うんで自信ないです。
最初の1回はrepeat〜loopで用意する必要ありますけど。
あでもmemcpy使えばrepeatの回数も少なく出来そう。
|
|
2007/12/4(Tue) 02:18:48|NO.12705
3000×3000でもrepeat〜loopでいいかもしれないくらいですが、
敢えて書くならこんなんかな。
以下のままだと100Mバイトのメモリを使うので、
メモリの少ない方はご注意。
n1=5000
n2=5000
value=5218
dim dest,n1,n2
num=n1*n2*4
byte=4
memcpy dest,value,byte,0,0
dstoff=4
nn=0
repeat
if dstoff+byte>num: break
memcpy dest,dest,byte,dstoff,0
dstoff+=byte
byte+=byte
nn++
loop
byte=num-dstoff
memcpy dest,dest,byte,dstoff,0
mes "ループ数="+nn
i=n1-1
j=n2-1
repeat 20
mes "dest("+0+","+cnt+")="+dest(0,cnt)+"\tdest("+i+","+j+")="+dest(i,j)
j--
loop
|
|
2007/12/4(Tue) 18:06:41|NO.12709
#uselib "kernel32.dll"
#func VirtualProtect "VirtualProtect" int,int,int,int
#define init4(%1, %2, %3, %4=0) dim %1, %3, %4:\
lpoke mset4@init4, 1, %2:\
lpoke mset4@init4, 6, %3*(%4+(%4==0)):\
lpoke mset4@init4, 11, varptr(%1):\
res@init4=callfunc(res@init4, varptr(mset4@init4), 0)
mset4@init4=$000000b8,$0000b900,$00bf0000,$9c000000,$9dabf3fc,$c3
VirtualProtect varptr(mset4@init4), length(mset4@init4)<<2, $40, varptr(res@init4)
/*
init4 p1, p2, p3, p4
p1 : 初期化変数名
p2 : 初期化する値
p3 : 1次元配列数
p4 : 2次元配列数
*/
; ---------------------------------------------------------------------
init4 a, 123, 5, 5
repeat length2(a)
c=cnt
repeat length(a)
mes a(cnt, c)
loop
loop
Please use this.
|
|
2007/12/4(Tue) 19:27:37|NO.12710
dim a, 10000, 10000
end
私はこれが遅いと気づきました.
|
|