|
|
2008/6/24(Tue) 18:41:02|NO.16966
すごく低レベルな質問なのですが・・・
配列の中に入っているものを配列a→配列bへコピーする事は出来ないでしょうか?
一応、動作を満たすのであれば
// 配列変数を作成
sdim a,32
sdim b,32
a = "a","b","c","d","e","f","g"
repeat length(a)
// b(cnt) = a(cnt)
memcpy b(cnt),a(cnt),strlen(a(cnt))
loop
// d
dialog b(3)
end
このようなプログラムを記述すれば問題はないのですが、ヘルプファイルをみているところ
dup
を使えばできるのかな??
っという仮説にたどり着きましたが上手く動作できませんでした。
何かスマートな方法があれば教えて下さい。よろしくお願いします。
|
|
2008/6/24(Tue) 19:54:35|NO.16967
それなら力技ですけど
sdim a,32
sdim b,32
a = "a","b","c","d","e","f","g"
repeat 7
b(cnt) = a(cnt)
loop
dialog b(3)
end
でOKですよ。
|
|
2008/6/25(Wed) 03:24:54|NO.16984
モジュールにすれば、1行で済みます。
#module
#deffunc arraycopy array p1, array p2
foreach p1
p2(cnt) = p1(cnt)
loop
return
#global
a = "a","b","c","d","e","f","g"
arraycopy a,i
repeat length(i)
dialog i(cnt)
loop
dialog "もう一度"
arraycopy a,u
repeat length(u)
dialog u(cnt)
loop
|
|
2008/6/25(Wed) 10:49:37|NO.16990
dupの説明を見ると「クローンを作る」とあります。が、実際には「同じものを指す別の名前」と考えた方がよいです。
これは、a が複製されて2つになる訳ではありません。
a の配列の一部の要素に別名をつけてアクセスする例を示します。
sdim a,2,4
a="H","E","L","L"
dup b,a(2)
c="" : foreach a : c+=a(cnt) : loop
mes c
b="A"
c="" : foreach a : c+=a(cnt) : loop
mes c
|
|
2008/6/25(Wed) 13:14:04|NO.16992
ちょっと無理やりかもしれませんが、
memcpyを使う方法はどうでしょうか?
配列も、INT=4バイト、Double=8バイトなので、
lenngthとバイト数をかけてやると、
僕のところでは問題なく動いています。
ただ、配列が絶対連続しているという保証が無いので、
自身はありませんが…
|
|
2008/6/25(Wed) 13:20:48|NO.16993
連続投稿すみません…
ちなみに、今回の件の文字列はできませんでした。
一要素ごとに、管理情報が入っていたので、
サイズも計算できないし、管理情報もコピッてしまうし…
文字列配列は、やっかいでした。
|
|
2008/6/25(Wed) 13:30:56|NO.16994
またまた、すみません…
dupの動作は、
sdim a,2,4
dup b,a
mes varptr(a)
mes varptr(b)
を実行してみると、分かりやすいと思います。
|
|
2008/6/26(Thu) 00:20:10|NO.17015
確か=で代入すると丸ごとコピーされないときがあった気がします。
確か、途中に終端文字コードが入っていたりすると・・・
ってなるとmemcpyの方が良いのでしょうかね
|
|
2008/6/26(Thu) 01:00:57|NO.17017
素直に最初の方法を使うのが、便利かつ安全だと思いますがね。
スマートなやり方は、シンバルさんのモジュールにしてしまう方法。
> memcpyの方が良いのでしょうかね
= の代入は終端コードまでしかコピーしてくれないので、
変数のサイズが分かるなら、memcpy の方が良いです。早いですし。
// memcpy の早さを実証するスクリプト
#uselib "winmm.dll"
#cfunc timeGetTime "timeGetTime"// 時間取得用のAPI
randomize
sdim a, 64, 12
sdim b, 64, 12
// 適当な文字列を作る
foreach b
i = cnt
repeat 60
lpoke a(i), cnt, rnd('Z' - 'A') + 'A'
loop
loop
// 時間を10回位計測
repeat 10
time = timeGetTime()
repeat 10000
foreach b
// どれかのコメントを外して計測
; b(cnt) = a(cnt)
; memcpy b(cnt), a(cnt), 64
; memcpy b(cnt), a(cnt), strlen(a(cnt))
loop
loop
time = timeGetTime() - time
mes time
loop
stop
あと、
> // 配列変数を作成
> sdim a,32
> sdim b,32
は、配列になっていませんね。
|
|
2008/6/27(Fri) 14:11:04|NO.17034
おそらくやみねこさんがやったもの
a=3333,2222,3333
#module
//ArrayCpy 配列変数を丸ごとコピーする
//_n コピー先の変数
//_m コピー元の変数
//_vartype 配列変数の型(※省略時は自動的に設定されます)
//_length 配列変数の要素の数(※省略時は自動的に計算されます)
#deffunc ArrayCopy array _n, array _m, int _vartype, int _length, local len, local fstr, local vart
if _length=0{
len=length(_m)
}else{
len=_length
}
switch _vartype
case 0
switch vartype(_m)
case 2
fstr=1
swbreak
case 3
vart=8
dimtype _n, 3, len
swbreak
case 4
vart=4
dim _n,len
swbreak
swend
swbreak
case 2
fstr=1
swbreak
case 3
dimtype _n, 3, len
vart=8
swbreak
case 4
dim _n,len
vart=4
swbreak
swend
if fstr{
}
memcpy _n, _m, vart*len
return
#global
a=1,2,3,4,1111,2222,3333,4444
ArrayCopy b,a
repeat length(b)
mes b(cnt)
loop
mes
a=0.1,0.2,0.4
ArrayCopy b,a
repeat length(b)
mes b(cnt)
loop
文字列型も対応させようとおもったんだが、出来なかったorz
|
|
2008/6/28(Sat) 17:26:50|NO.17049
なるほど、ありがとうございました。
|
|