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


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
0907
@key配列の特定の値でのクリア3未解決


@key

リンク

2012/9/7(Fri) 22:05:56|NO.49210

ある配列(int)を一定の値でクリアする方法で効率がいい方法を教えて下さい
memsetは使えないので、クリアする範囲の回数だけループする方法しか思い浮かびません



この記事に返信する


暇人

リンク

2012/9/7(Fri) 23:20:51|NO.49217

初期化する数が多いほど
回数分ループするより早くなるかな・・・


dim a,300 s=15 //書き換え開始位置 c=200//書き換え個数 a(s)=123456 //書き換え数値(開始位置に最初から書き込んどく) b=(c-1)*4 //書き換えバイトサイズ(最初に一つ書き換えてるから-1) siz=4 //最初の書き換えバイト数 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 } repeat length(a) pos (cnt/25)*50,(cnt\25)*16 mes a(cnt) loop



暇人

リンク

2012/9/8(Sat) 02:26:32|NO.49218

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



@key

リンク

2012/9/8(Sat) 02:39:32|NO.49220

本当自分は発想力が足りないです
ありがとうございます!



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