|
|
2010/6/18(Fri) 17:53:31|NO.33309
repeat gmax
notesel gdata(cnt):noteget gdata_,gn
split gdata_,",",gmx(cnt),gmy(cnt),gmuki(cnt),gg(cnt)
gmx(cnt)=int(gmx(cnt)):gmy(cnt)=int(gmy(cnt)):gmuki(cnt)=int(gmuki(cnt)):gg(cnt)=int(gg(cnt)) ・
・
・
・
","で区切られたテキストデータから各配列変数にデータを代入したかったのですが
splitのところで「異なる形を持つ配列変数に代入しました」とエラーになってしまいます。
数値しか代入できない状態なのかと思い、
repeatの前にsdim gmx,99999,100:sdim gmy,99・・・を入れてみましたが何も変わりませんでした。
なぜエラーになるのかわかりません(T_T)
代入は不可能なのですか?
|
|
2010/6/18(Fri) 19:30:29|NO.33310
gmx(cnt)=int(gmx(cnt))は(なにをしているのか分からない...)
代入使用としている値(左辺)int(整数型)なのに、
配列をsdimで初期化するとstr(文字列型)になるので
代入ができないのではないでしょうか?
配列は普通の変数と違い型がちがうとい基本的に代入できないので...。
そもそも若干スクリプトの意味がわからないのですが...
以下のようなことがしたいのでしょうか?
; 実際に実行はしていません...(オイ!)
notesel DATA:noteload FILE
;MAX=notemax
dim gmx,MAX:dim gmy,MAX:dim gmuki,MAX:dim gg,MAX
repeat MAX
noteget LINE_DATA,cnt
split LINE_DATA,",",mx,my,muki,g
gmx(cnt)=int(mx):gmy(cnt)=int(my):gmuki(cnt)=int(muki):gg(cnt)=int(g)
loop
|
|
2010/6/18(Fri) 20:36:20|NO.33311
すいません。
これじゃ何がしたいのかさっぱりですよね。
split gdata_,",",gmx(cnt),gmy(cnt),gmuki(cnt),gg(cnt)
簡単に言うとこのスクリプトがなぜエラーになるのかが知りたいんです。
gdataにはリプレイのデータがカンマで区切って大量に入っています。
gdataの中↓
103,292,0,1
106,292,0,1
・
・
一つのリプレイを表示するだけならcntはいらないので
split gdata_,",",gmx,gmy,gmuki,gg
これで問題なくできるのですが、複数のリプレイを同時進行させたくてcntを入れました。
そうしたら代入できなくなってしまったんです。
gmx(cnt)=int(gmx(cnt)):gmy(cnt)=int(gmy(cnt)):gmuki(cnt)=int(gmuki(cnt)):gg(cnt)=int(gg(cnt))
これは仮に代入できたとしても数値に変換しないとエラーになるからです。
いろいろとわかりにくくてすいません。
ご教授お願いいたします。
|
|
2010/6/18(Fri) 21:13:31|NO.33312
配列の要素に、その配列変数と異なる型の値を代入することはできません。
// 例
sdim s, 3 // str 型の配列
s(1) = "x" // str は ok
s(1) = 10 // int はダメ
// (余談)
// 要素 (0) に、配列と異なる型の値を代入しようとすると、
// 自動的に変数が初期化されます。
s(0) = 3
mes length(s)
なので、gmx(cnt) = int( gmx(cnt) ) などは矛盾した代入文です。
( 右辺では: gmx(cnt) が int でないため、それを int に変換している。 )
( 左辺では: gmx(cnt) に int を代入している。 )
|
|
2010/6/18(Fri) 21:19:33|NO.33314
gdata = "12,14,33,44\n223,43,55,44\n1234,23,54,22"
dim mx,2
repeat 3
notesel gdata
noteget gdata,cnt
split gdata , "," , mx(1) , my , muki , g
gmx(cnt) = int(mx)
gmy(cnt) = int(my)
gmuki(cnt) = int(muki)
gg(cnt) = int(g)
loop
多分こういうことだと思います。
splitの受け取り用の変数 gmx gmy gmuki gg が 繰り返し一回目で、数値型の値を代入したことにより
数値型に変換されています。
先頭要素が数値型である場合、文字列型を代入しようとすると エラーが起こります。
それは、他のタイプでも一緒です。
// 下の例は全てErrorに成る
dim i , 2
i.1 = "text"
i.1 = 0.00123
sdim s , 100 , 2
s.1 = 100
s.1 = 0.01
ddim d , 2
d.1 = "text"
d.1 = 123456789
|
|
2010/6/18(Fri) 21:34:57|NO.33315
あちゃ、変なこと書きました。申し訳ないです。
> gmx(cnt) = int( gmx(cnt) ) などは矛盾した代入文です。
自分で余談として言ったとおり、cnt = 0 のときには、これはちゃんと動きます。
( gmx が int 型の変数になります。 )
そして、2回目の split が、int 型である gmx(1) に str 型の値を代入しようとするので、
そのときエラーになります。
( 要するに info さんのレスと同じ意見です )
|
|
2010/6/18(Fri) 21:37:19|NO.33316
回答ありがとうございます。
3人のご返答を見てやっと意味がわかりました。
splitが悪いのではなく、gmx(cnt)=int(gmx(cnt))が悪かったんですね。
gmx2(cnt)=int(gmx(cnt))に直してやっとエラーがなくなりました。
リプレイの速度が恐ろしいスピードになっていますが後はどうにか頑張ってみます!
|
|
2010/6/19(Sat) 11:02:35|NO.33319
「異なる型を持つ配列変数に代入しました」
と出るんですから命令の要求する型が違うんですね
後学のためにですけど
配列変数に限らず
変数には色々な型の要素を代入できますが
命令の引数には命令の要求する型を使用してないとerrorが出るので
型は意識しましょう
|
|