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


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
0624
DoubleQuote配列丸ごとコピー10停止


DoubleQuote

リンク

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



SYAM

リンク

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)
を実行してみると、分かりやすいと思います。



DoubleQuote

リンク

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
は、配列になっていませんね。



A

リンク

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



DoubleQuote

リンク

2008/6/28(Sat) 17:26:50|NO.17049

なるほど、ありがとうございました。



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