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


HSPTV!掲示板


未解決 解決 停止 削除要請

2007
0823
ふにゃふにゃ変数型と多次元配列に関する疑問19解決


ふにゃふにゃ

リンク

2007/8/23(Thu) 11:41:33|NO.10579

多次元配列の要素に対するアクセスが上手く行かなくて困っています。
色々、やっているうちに配列変数の型に関する自分の理解に、
中途半端な点が残っている事に気付きました。

全部オサライする積もりで、下記の様なスクリプトを作って実験しましたが、
自分の理解ではツジツマが合わない現象に出くわしています。
もう「コレはこう言うもんだ」と思うしか無いのでしょうか?


//dimについての実験1 dim suuti_test1 , 2 suuti_test1(0)=1 ;suuti(1)="10" //suuti_test1の要素に文字列を代入しようとするとエラーが出る mes "\n---------------------------------------------------\n" //dimについての実験2 dim suuti_test2 , 2 suuti_test2(0)="10" //sdimではなく、dimを使った配列変数に文字列を代入しているが //この場合エラーにはならない ;suuti_test2(1)=1 //エラーになる。 //dimで配列の宣言をしていても、最初に文字列を代入したら、 //数値は代入できない。 mes "\n---------------------------------------------------\n" //sdimについての実験1 sdim suuji_moji , , 2 suuji_moji(0)=1 ;suuji_moji(1)="10" ;この場合もここでエラーが出る。 ;sdimを宣言してあっても、数値を代入する事はできる。 ;一旦、数値を代入すると以降は文字列を代入できない mes "\n---------------------------------------------------\n" //sdimについての実験2 sdim suuji_moji , , 2 suuji_moji(0)="10" ;suuji_moji(1)=1 ;この場合もここでエラーが出る。 mes "\n---------------------------------------------------\n" //dimとsdimの違いに関する個人的なまとめ /* 標準のヘルプファイルでは、 「dim」が「配列変数を作成」で 「sdim」が「文字列型の配列変数を作成」となっているが、 本当は、どちらを使っても、両方の型の配列変数が作成できるので、 この表現は正確ではない。 「dim」と「sdim」の違いは、「デフォルト文字数」を指定できるかどうか? の1点だけで、配列変数の型を直接決定するものではない。 配列変数の型が決まるのは、初期化の時ではなく、 最初の要素を代入した時。 */ mes "\n---------------------------------------------------\n" //多次元配列の扱いについての実験 sdim tajigen_moji,,2,2 tajigen_moji(0,0)=1 ;sdimで初期化した多次元配列に数値を代入する事はできる。 ;mes tajigen_moji(0,0) ;ところが、数値が代入されたtajigen_moji(0,0)の ;中身を利用しようとすると「配列の要素が無効です」が出る /* 何だかワケがわからない。 そもそもsdimとは何なのか? 1次元の配列と、多次元配列と、どう違うのか? 代入できるのに、中身が利用できないのは何故? */



この記事に返信する


アルマゲ丼

リンク

2007/8/23(Thu) 11:52:28|NO.10580

dimは整数値、sdimは文字列、って使い分ければいいだけなのでは。



ふにゃふにゃ

リンク

2007/8/23(Thu) 12:17:09|NO.10581

有難う御座います。
もう、そう言うもんだって思って割り切るしかないんですかねー。
でも実際、下記のスクリの実行結果は「10100」じゃなくて「110」なんですよー。
何かヤだなー。


//sdimで足し算 sdim sample,,2 sample(0)=10 sample(1)=100 mes sample(0)+sample(1)



f

リンク

2007/8/23(Thu) 12:22:24|NO.10582

>でも実際、下記のスクリの実行結果は「10100」じゃなくて「110」なんですよー。

どう見ても当たり前にしか見えないのだが。



アルマゲ丼

リンク

2007/8/23(Thu) 12:31:12|NO.10584

110になるのは、当たり前だのクラッカー、なのでは。



f

リンク

2007/8/23(Thu) 12:33:13|NO.10585

ちうか、
「この目的で使用してください」と用途を指定されている物を
用途外の使い方した上で、

「思ったとおりに動かない」と言われるのは、心外の極みであろうと思う。



ふにゃふにゃ

リンク

2007/8/23(Thu) 13:06:00|NO.10586

整数同士の足し算をしたら、結果が110になるのは当たり前ですよね。
絶対そうですよね。うんうん。って思ってたんですよ。
だから、


sdim tajigen_test1,,2,2 tajigen_test1(0,0)=10 tajigen_test1(1,0)=100 mes tajigen_test(0,0)+tajigen_test(1,0)

と言うのも、アリだと思っていたんです。
実行結果は「110」になって当たり前と・・。
でもこの場合は、「110」にも「10100」にもなりません。
最後の行で「Error 7 配列の要素が無効です」ってなるんです。
発言10581との違いは、配列の添え字が2次元になっている事だけなのに・・
「一体、sdimで初期化した配列に整数はセットできるのか、できないのか、どっちだっけ?」と。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(これが結論?)

sdimで初期化してあっても、添え字が1次元なら整数をセットして利用できる。
添え字が2次元だと、整数をセットする事はできるけど、
実際にその中身を利用しようとしたら、利用できない。

でも、そういうのはsdimの用途外!
仮にできても、やっちゃダメ

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

そう言うもんだって、割り切って、
考えるのヤメちゃうのが、正しい選択なんでしょうね。
有難う御座います。そう言ってもらえたら、それはそれで納得できました。
これで良いんですよね。



ふにゃふにゃ

リンク

2007/8/23(Thu) 13:20:29|NO.10588

別にこれってイージーな解決じゃないですよね。

「できようが、できまいが、
sdimで初期化した配列に整数はセットしない。
考えるのは、そこまでにしておく。」

有難う御座いました。



('з')

リンク

2007/8/23(Thu) 13:31:02|NO.10591

>文字列型の配列変数を作成します。
F1ヘルプのにはこう書いてあるのに
なんで数値を代入しようとするのかがわからん。



ふにゃふにゃ

リンク

2007/8/23(Thu) 13:46:31|NO.10592

それは私が関西人だからです。

(スルーして下さい)



f

リンク

2007/8/23(Thu) 13:46:39|NO.10593

・・・・・。

「・・・おかしいじゃないか!こまるじゃないか!!

 「・・・どうかしましたか?

「この自動販売機、僕はコーラが欲しいのに、何回買ってもコーヒーが出てくるんです!

 「故障ですか?どんな操作をしたのですか?

「120円を入れて、このコーヒーの所のボタンを押したんです。
 この自動販売機ではコーヒーしか買えないと割り切るしかないんですかね?
 それとも、コーラが欲しければ、コーラの所のボタンを押すしかないんでしょうか?

俺的には、こんな印象・・・。
結果として正しい結論に至ったのなら、別に良いけど。



ふにゃふにゃ

リンク

2007/8/23(Thu) 14:00:08|NO.10595

私はコーヒーのボタンとコーラのボタンを2つ同時に押したら、
どっちが出て来るか、試す事があります。

全ての組合せで実験しようとしたら、お腹がいっぱいになるので、
いつも途中で挫折しますけど。

(マジレス禁止です)



tks

リンク

2007/8/23(Thu) 14:07:46|NO.10596

> 実行結果は「110」になって当たり前と・・。
> でもこの場合は、「110」にも「10100」にもなりません。
> 最後の行で「Error 7 配列の要素が無効です」ってなるんです。

それは配列名が間違っているからです。ちゃんと「110」になります。



ふにゃふにゃ

リンク

2007/8/23(Thu) 14:37:42|NO.10598

有難う御座いました。修正しました。


sdim tajigen_test,,2,2 tajigen_test(0,0)=10 tajigen_test(1,0)=100 mes tajigen_test(0,0)+tajigen_test(1,0)

うぇ、ちゃんと加算できちゃいますね。
コレはハズミでコーラが出ているだけで、
無視するべきなのでしょうか?

それとも深い理解をしている人にとっては、
コレはコレで理由がわかる?
また、悩んできました。

配列ではない一つだけの変数なら
a="" とか
a=0 とか言うやり方で、
初期化すると、値だけでなく型も同時に変更できますよね。

実際のところ、変数の型は、どの時点で決まるのでしょうか。

制作中の本チャン用スクリもコレと同じ状態になっています。
長いので貼りませんが、思い通りにならないのは、
変数の型の指定に問題が有るのか、そっちには問題が無く、
変数名の誤植等のケアレスミスを洗い直すべきなのか・・。
うーん。



tks

リンク

2007/8/23(Thu) 14:49:34|NO.10600

> 実際のところ、変数の型は、どの時点で決まるのでしょうか。
たぶん、もとの型と違うものが入ったときに初期化されるのかと。
デバッグウィンドウを表示して型や配列を見てください。

sdim s,64,2,2;sを文字列型二次元配列として初期化 s=0;sは数値型変数になる、というか初期化される s="s";sは文字列型変数になる、というか初期化される s(0,0)=1;sは数値型配列になる、というか初期化される ;この時点ではまだ一次元、というか数値型変数と一緒 s(1,0)=2;ここで二次元となる
vartype()で型を調べてみるのも一つの方法かと。



ふにゃふにゃ

リンク

2007/8/23(Thu) 16:16:27|NO.10602

有難う御座いました。

空っぽの配列に別の型の値を代入すると、
代入に成功するのではなく、初期化がやり直しになるのですね。

お陰様で、最初の間違いの理由が明確に出来ました。

本チャンのスクリプトでは、「00001」の様な
文字列としても数値としても扱い得るデータのID番号の様な物を、
int()したり、strf()しながら、コロコロ動かしているので、
知らないウチに、変数型が変わってしまっている所が有るのかも知れません。

これは良い点に気付かせて頂きました。
同じ間違いに気付くのでも、
「こう言うもんだ」で割り切るのではなく、キチンと理解できました。
コダワッテ見て良かったです。


s(0,0)=1;sは数値型配列になる、というか初期化される ;この時点ではまだ一次元、というか数値型変数と一緒 s(1,0)=2;ここで二次元となる

ここの所ですが、デバッグウインドウを見ると

s(0,0)=1 の状態でstopすると
型:int
配列:(1,1,0,0)となり

s(1,0)=2 の状態で
型:int
配列:(2,1,0,0)となっているので、

これは両方とも2次元の整数型配列変数と見て良い様です。



n

リンク

2007/8/23(Thu) 16:51:14|NO.10608

>dimは整数値、sdimは文字列、って使い分ければいいだけなのでは。
>もう、そう言うもんだって思って割り切るしかないんですかねー。
割り切るも何もマニュアルにもそう書いてあんだろが。
何がコダワッテだばか。マニュアルを読んでないだけじゃねーか。
マニュアルを読まずに何がコダワリだ。



tks

リンク

2007/8/23(Thu) 18:00:22|NO.10610

s(0,0)=1 の状態でstopすると
> 型:int
> 配列:(1,1,0,0)となり

> s(1,0)=2 の状態で
> 型:int
> 配列:(2,1,0,0)となっているので、

> これは両方とも2次元の整数型配列変数と見て良い様です。

確かに…。(1,0,0,0)になっているように見えたんですが…。
見間違いでした。



ふにゃふにゃ

リンク

2007/8/23(Thu) 19:34:49|NO.10611

有難う御座いました。
ツマラン事で何を騒いでいるかと言うと、
チャンとしたスクリプトの作り方ではなく、
変なスクリプトを作ってしまった後のデバッグのヒントです。
とても参考になるアドバイスでした。

[わかったことのマトメ]


dim a,10 mes vartype(a) : mes length(a) ;aは10個の要素を持つ整数型の配列変数である事が確認できる。 ;コレは当たり前。 dim b,10 b(0)="あ" mes vartype(b) : mes length(b) ;bは1個の要素を持つ文字列型の配列変数になっている。 ;bに文字列が代入できてしまっている様に見えるけれど、 ;実はbは自動的に初期化がやり直しされているだけだから、 ;10個あったはずの要素数が1個に減っている。 /* こんなバカな事は普通はワザとする必要は無い。 コレは皆さんの御指摘の通り。 でも、長いスクリの場合 */ c="00001" d="00002" /* その後で、何やかんやの処理を数百行〜〜〜 cやdを文字列型にしていた事を本人忘れる。 */ dim e,100 e(0)=c : e(1)=d /* とか、やってしまっても、エラーは出ないので 本人は配列変数eが、整数「1」と整数「2」と98個のnullを要素に持つ 整数型の配列だと思ったまま、気付かない事がある。 そのまんま、何やかんやの処理を、更に数百行〜〜〜 配列の要素の実数が、いくつだったか、本人は忘れたまま、 ルーブ処理などを始める。とにかくdim宣言をした時に、 要素数を100にした事だけ覚えているので、こんな事をする。 */ i=0 repeat 100 f+=e(i) i++ loop /* とかやってしまうと、「配列の要素が無効」と言われ、 頭を抱える事になるから注意しましょう(To自分)。 */



MF

リンク

2007/8/23(Thu) 20:17:18|NO.10612

混乱しないようにするには変数名を分かりやすくすればいい。

score_int=100 score_str=str(score)
とか。
短いスクリプトならまだいいが、変数名にaとかbとか安易に使うもんじゃない。



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