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


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
1103
字がキタナイ2次元の配列をdimで確保したものに、文字列を入れたときのおかしなエラー。6解決


字がキタナイ

リンク

2010/11/3(Wed) 19:09:15|NO.35655

hsp 3.2と、3.22で確認した現象です。


dim test,20,20 test(0,0)= " " print 0 test(0,1)= " " print 1 test(1,0)= " " print 2

のプログラムを実行させると、test(1,0)に" "を代入した時点で、
「-->配列の要素が無効です」のエラーメッセージが出ます。
printはどこでエラーが起きるかの確認のためで、なくても同じです。

dimで確保してる配列に、文字列を入れること自体、間違って
るのはわかってますが、配列変数が、文字列型になってしまうの
でもなく、
「-->異なる型を持つ配列変数に代入しました」のエラーがでるわ
けでもないのは、どうも、奇妙ですが、これは仕様なんでしょうか?

どうも、先に、test(0,0)とtest(0,1)に文字列を代入しているあたり
が、おかしくなる原因のように思いますが・・・。

なお、


dim test,20,20 test(1,0)= " "

ですと、「-->異なる型を持つ配列変数に代入しました」
のエラーになります。



この記事に返信する


KA

リンク

2010/11/3(Wed) 19:24:09|NO.35656

sdim を調べましょう。



f3d

リンク

2010/11/3(Wed) 20:29:52|NO.35661

変数には型というものがあります。
例としては
整数型
実数型
文字列型
などです。

dimというのは
整数型の配列を確保する命令です。
しかしそのスクリプトでは
文字列を代入しているので上記のエラーが出たんではないでしょうか?
えっとあsdim?かな
多分ね。。。。。



test

リンク

2010/11/3(Wed) 20:59:49|NO.35662

皆さん、よく質問を読みましょう。字がキタナイさんは、型の区別はついています。

さて、この例では、testはちゃんと文字列型に変わっています。このことは、vartypeで調べることができます。
次のサンプルを見てください。
dim test,20,20
mes ""+length(test)+" / "+length2(test)+" / "+vartype(test) test(0,0)= " " mes ""+length(test)+" / "+length2(test)+" / "+vartype(test) test(1,0)= " " mes ""+length(test)+" / "+length2(test)+" / "+vartype(test)
dimでtestを作ったときには、ちゃんと要素は20×20あり、数値型です。 test(0,0)に文字列を代入した時点で要素は1つだけになり文字列型になっています。
また、test(0,0)に代入する行を消すと、いきなりtest(1,0)に代入しようとした時点で「異なる型を持つ配列変数に代入しました」のエラーが出ます。

つまり、test(0,0)に代入しようとした時だけエラーが起きずに文字列として初期化されているのです。
実はこれは、test(0,0)のように配列の一番最初の要素を表すとき、test のように数字を省略してただの変数のように表すことができます。
このことは、
a= 5,6,7:mes a
のようにしてみると分かります。
test=" "のように、数値型の配列として利用していた変数をただの文字列型の変数として再利用するのはありうることですから、このような動作になっていると考えられます。



test

リンク

2010/11/3(Wed) 21:16:22|NO.35665

すみません。「配列の要素が無効です」が出る原因を説明し忘れていました。

配列の仕組みは文字列型でも数値型でもおおかた同じなので、単純化した
a=0
a(0,1)=1 a(1,0)=2
でも同じエラーが出ます。
詳しいことはhttp://hspdev-wiki.net/?%CA%D1%BF%F4%CE%CE%B0%E8%A4%CE%BC%AB%C6%B0%B3%CE%CA%DDに載っているのですが、
配列というのは、メモリ上に各要素のデータが順番に並んでいます。つまり、例えば
a(0)=0
a(1)=1 a(2)=2
では、最初はaはa(0)だけに要素がある要素数1の配列となり、そのあとa(1)に代入する場合、データの後ろに付け足すだけで済むのです。 ここで、二次元配列の場合は、最初にdimで確保した後は、1次元目(a(m,n)のmの部分)は固定されてしまい、2次元目(nの部分)だけが拡張できるようになります。
そのため、1次元目が配列で確保されたものより多い場合は拡張することができずにエラーとなるのです。
test(0,0)=" "
のようにしてdimやsdimを使わずに2次元配列を作った場合要素は1つだけとなり、すなわち
sdim test,64,1,1
と同じになるため、test(1,0)以降が拡張できなくなっていたのです。



damage

リンク

2010/11/4(Thu) 00:30:29|NO.35670

>test
正解。



字がキタナイ

リンク

2010/11/4(Thu) 03:43:01|NO.35671

とても参考になりました。
内部的なバグの可能性も捨てきれなく、少し不安に
思ってたんですが、内部的な仕様によるものとわかって、
すっきりしました。

ありがとうございました。



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