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


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0618
_hamyuu配列変数にデータが代入できません7解決


_hamyuu

リンク

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)
代入は不可能なのですか?



この記事に返信する


hatter

リンク

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



_hamyuu

リンク

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 を代入している。 )



info

リンク

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 さんのレスと同じ意見です )



_hamyuu

リンク

2010/6/18(Fri) 21:37:19|NO.33316

回答ありがとうございます。
3人のご返答を見てやっと意味がわかりました。
splitが悪いのではなく、gmx(cnt)=int(gmx(cnt))が悪かったんですね。
gmx2(cnt)=int(gmx(cnt))に直してやっとエラーがなくなりました。
リプレイの速度が恐ろしいスピードになっていますが後はどうにか頑張ってみます!



y.tack

リンク

2010/6/19(Sat) 11:02:35|NO.33319

「異なる型を持つ配列変数に代入しました」
と出るんですから命令の要求する型が違うんですね

後学のためにですけど
配列変数に限らず
変数には色々な型の要素を代入できますが
命令の引数には命令の要求する型を使用してないとerrorが出るので
型は意識しましょう



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