HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2007
1202
としあきmemsetがうまく使えない。8解決


としあき

リンク

2007/12/2(Sun) 21:50:30|NO.12688

MAP用に、2次元配列MAPを作るのですが、たとえば、
dim map,30,30

と指定すると、mapの配列変数の中身はみんな0になります。 そこで、配列変数mapの中身を、たとえば、1の数字で全部埋めたいのです。 調べてみると、memset命令を使えばいいみたいですが、ヘルプの説明書を呼んでも、恥ずかしい話、さっぱり分かりません。 こうだと思って書いても、うまく配列変数すべてに同じ数字を入れるどころか、エラーばかりおきます。 申し訳ないですが、誰か、配列変数に0以外の特定の数字を入れる方法を教えてください。



この記事に返信する


GENKI

リンク

2007/12/2(Sun) 23:03:49|NO.12689

repeat〜loop命令ではダメなのですか?



f

リンク

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しかないですか・・・

いろいろご迷惑かけてすみません。



GENKI

リンク

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の回数も少なく出来そう。



ANTARES

リンク

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
私はこれが遅いと気づきました.



ONION software Copyright 1997-2023(c) All rights reserved.