プレイ日記
yuy(α) studio-reader
サブルーチンの中で宣言した配列変数を別のサブルーチンで使おうとしたら、変数が存在しないと返された。 サブルーチンの中で宣言するとローカル変数になる仕様なのか、それとも単なるバグなのか。どちらにしても、不便だ… 画像は確認用のプログラム。変数が存在しないと返される。
3そうだね
プレイ済み
返信[1]
親投稿
一応、公式ガイドブックに、『配列や変数の宣言はプログラムの冒頭の行で行おう』(56頁)と記載されて居るので、仕様と謂う事に成るのでせうが、不便ですね。使用する前で有れば、何処で宣言しても良い様に変更して欲しい物です。序に、動的配列も使える様に…。
0そうだね
プレイ済み
返信[2]
親投稿
プチコン3号が地味に変な仕様になってるからなのー。 VARとかDIMはGOTO,GOSUBなどの流れにかかわらず上から読んでいくなのー。
0そうだね
プレイ済み
返信[3]
親投稿
みむ*mim hidemimtp
これが出来ないのは不便なのかな・・・・ こういうタイミングでの宣言は後でハチャメチャになる原因な気がするので、エラーが出なかったとしても変数の宣言は最初に書いておくべきだと個人的には思っています。
0そうだね
プレイ済み
返信[4]
親投稿
yuy(α) studio-reader
>いかせんせいへ あれはそういう仕様だというより、単に変数を把握をしやすくするためのアドバイスともとれますし、それだけで仕様と言うには弱いですね。 ただ変な仕様がチラホラとあるこのプチコン、どれがバグでどれが仕様だかわかりませんね。(かつてのspset関連とかvar関数とか)
1そうだね
プレイ済み
返信[5]
親投稿
yuy(α) studio-reader
>あまさとさんへ 道理で、実行した瞬間にエラーになるのですね。 やっぱり変だプチコン3号。
1そうだね
プレイ済み
返信[6]
親投稿
プチコン3号には、動的配列(宣言時に要素数が未定の配列)やREDIMステートメントが無い為、配列の要素数を恣意的に変更する事が出来ません。此れは不定数のデータを扱う時には、必要以上に大きな配列を用意しなければ成らない事を意味します。N-BASICやF-BASICの様な初期のBASICでも此等は提供されて居り、現在の主たる高級言語は悉く此の機能を備えて居る事を考えれば、不便と謂わざる得ないでせう。 猶、コードの可読性等の為に、変数の宣言を其のブロックの先頭部分で宣言するのとは別問題です、為念。
0そうだね
プレイ済み
返信[7]
親投稿
これが出来ないとどんな「不便」があるのでしょうか。 教えてもらえると助かります。(不勉強で済みません。) ちなみに、ローカル変数にはならないようです。(サブルーチン定義の順番を入れ替えればエラーにならないためです。)また、名前の解決を1パスで行うための仕様だと思います。(実行開始が遅くなるのを避けるために、1パスになっていると思われます。)インタプリタ設計者の自由の範囲内かと思います。
0そうだね
プレイ済み
返信[8]
親投稿
Godot orz_127
プチコン3号は、実行前に一度プログラムを評価しているとのことです。 中間言語におとしこむ所まではしていないようですが。 エラーとなるのは、その関係かもしれません。 配列は、宣言必須です。 プログラム的にその配列変数最初に出てくる前に、その配列の定義がないと駄目みたいです。 @1と@2の順を丸まる入れ換えて見てください。 SEL$[]が初めて出てくるより前にDIMでの定義が存在する様になります。 この場合は、エラーせず動作するようです。 これをちやんと把握してプログラムを書けば、恐らくどこで配列の定義をしても大丈夫だと思います。
0そうだね
プレイ済み
返信[9]
親投稿
Godot orz_127
REDIMですが初代にはあったように記憶しています。 何故なくなったかは不明ですが。 動的配列がないと言うのがどういうことかよくわかりませんが。 DIM B[0] と定義して、PUSHやUNSHIFTで追加、POP、SHIFTで削除等、配列の要素を増減させることは可能です。 文字列も配列の一種らしく? PUSH、POP、SHIFT、UNSHIFTが使用できます。
0そうだね
プレイ済み
返信[10]
親投稿
Godot orz_127
すみません。 REDIMに関しては、記憶違いだったかもです m(_ _)m
0そうだね
プレイ済み
返信[11]
親投稿
MIKI ifconfig
配列のサイズの追加はたぶん n^2 に比例して時間がかかるので、あまりお勧めしません。文字列の追加も同様。
0そうだね
プレイ済み
返信[12]
親投稿
MIKI★さんへ それは、MIKI★さんが大きな配列をよく使うためで、実数型で500個、文字列で2000文字程度なら気にしなくても良いのではありませんか? 理由:以前、メモリリークが4Kバイト単位で発生していたので、メモリ管理の最小単位が2Kか4Kと推測しました。(それ以上の大きさの場合のメモリ管理方法はわかりませんが・・・)
0そうだね
プレイ済み
返信[13]
親投稿
マギー M191246
『そこまでしなくても』と言われそうですけど VAR関数を使えば 配列宣言が後方にあっても実行されていれば、 エラーにはならないみたいです。 配列のサイズについて。 バグかも知れませんけど COPY命令を使えば、 一度に大きくすることができるようです。 (小さくはできないみたい。) 以上、使えない豆知識でした。
0そうだね
プレイ済み
返信[14]
親投稿
おちゃめ ochame_nako
プチコン3号は変換速度やメモリ効率重視のため1パスコンパイラによる仮想マシンコードへの変換を実行直前に行っています。 そのため配列変数の宣言はその変数が実際に使われるよりも前の行で行う必要があります。 これは実際に実行される順番の早さは関係なくプログラム上に記述している順番で決まります。 そのためおかしいというよりはすごく素直な仕様だと思います。 自作関数内で使用している変数が宣言していない場合はローカル変数になるかグローバル変数になるかもこれさえ分かれば簡単です。
0そうだね
プレイ済み
返信[15]
親投稿
おちゃめ ochame_nako
いか☆せんせいへ プチコン3号の配列変数はPUSH、POP、SHIFT、UNSHIFTで動的に要素数を変化させることが可能なだけではなく私のプチコン3号入門講座でも書いていますが、PUSHやPOP等を使わずとも一発で要素数をゼロにしたり望みの要素数にすることも可能です。 また、実数型の配列を文字列配列として扱うことも可能になるなどプチコン3号の配列は他のBASICではあり得ないくらい極めて柔軟性が高い仕様となっています。(型のチェックが曖昧というだけなのですが)
0そうだね
プレイ済み
返信[16]
親投稿
yuy(α) studio-reader
何が起きた。 実は製作中のゲームは別のプログラムスロットにサブルーチンがあって、イベントを実行するときはそのサブルーチンを実行する仕組みになっているので、そこのサブルーチンを実行するときに配列を使う必要が出てきたのです。 しかし、宣言用のサブルーチンを置きましたが、実行してもその変数は存在しないと返され、サブルーチンの最初に宣言を置いてみましたが、ループで二回通っても二重定義にはなりませんでしたが、他のサブルーチンでは使えず、他のサブルーチンにも宣言を入れてみると、二重定義と返されたのです。 結局、サブルーチン内に宣言入れるのは無理だと感じ、別の方法とって解決しました。 別の方法とれるじゃんと思った人。投稿時には思い付かなかったのです。
2そうだね
プレイ済み
返信[17]
親投稿
みむ*mim hidemimtp
こういう、知的な炎上、大好き(笑)
0そうだね
プレイ済み
返信[18]
親投稿
Godot orz_127
マギーさん 要素数の少ない配列対してのCOPYでのサイズの拡大は、1次元配列のみ可能で、不具合出はなく、仕様だったと、思います。 先日読んだのですが、ネタ元は失念^^;
1そうだね
プレイ済み
返信[19]
親投稿
コータさんへ 私が不便に感じたのは、マップエディタを作成して居る時でした。マップ情報を格納する2次元配列を、操作画面(グラフィック)表示後に、幅と高さを入力して確保しようと仕た時に、例外が発生しました(勿論、宣言以前に使用は仕て居ません)。其の為、先ずコンソール画面で此等を入力し、配列の領域を確保した後、グラフィック画面を表示する様に変更を余儀無くされました。 更に、マップ作成時にサイズの変更を行う必要が生じた時、此の時点で新たな配列を作成する事は元より、配列の要素数を変更する事も出来ませんでした(PUSHステートメントやPOP関数は多次元配列には適用出来ない様です)。多次元配列でも、要素数の異なる配列を参照させる事で、要素数を変更する事は出来ますが、参照元と成る配列を、要素数未定時に宣言して置かなければ成らないと謂う矛盾が生じます。(続く)
0そうだね
プレイ済み
返信[20]
親投稿
勿論、2次元配列を1次元配列に変更する等、対処法は色々有りますが、必要な時に必要な配列を使えないと謂うのは、矢張り『不便』では無いでせうか。亦、私は、『不便』と思う気持ちが、『便利』な物を産み出す原動力だと考えて居ます。
0そうだね
プレイ済み
返信[21]
親投稿
おちゃめさんへ 貴方のサイトへは、私のサイトよりリンクを貼らせて貰って居ます。80年代前半からのプログラミング歴と謂う事で親近感を感じて居ます(私の本棚には83年11月号からのI/O誌が残って居ます)。 小中高生を含む若い人達にプログラミングを普及させる為に、プチコン3号の世界に参入して来ましたが、本当にプチコン3号は面白いですね(開発環境と仕ても、言語と仕ても)。皆が多少成り共プログラミングの心得が有る時代が来る様に、益々プチコン3号が普及し、発展して欲しいと願って居ます。
0そうだね
プレイ済み
返信[22]
親投稿
マギー M191246
Godotさんへ 仕様だったのですか! 以前、自分で試したときに 配列のサイズが大きくなって 何かのときに使えるかなって思っていました。 教えていただき、 ありがとうございます。
1そうだね
プレイ済み
返信[23]
親投稿
Godot orz_127
1次元COPYの件 元にした所は見つかりませんでしたが ヘルプにもそれらしいことが書いてありました^^;
1そうだね
プレイ済み
返信[24]
親投稿
いか☆せんせいさんへ 返事が遅くなってすみません。 再開したのは、プチコンの不具合だったとおもいます。
0そうだね
プレイ済み
返信[25]
親投稿
参照の引き継ぎの例です。
0そうだね
プレイ済み
返信[26]
親投稿
マギー M191246
COPYで、配列を大きくする処理について。 ヘルプでは、少しわかりにくいかなと思う所を 補足してみたいと思います。 それは、『コピー先オフセット』自体も コピー先配列の要素数を 越えて指定でる点です。 例えば、要素数5の配列があったとして COPY A,100.A,0 と指示すると この配列の要素数を 100にすることができます。
0そうだね
プレイ済み
返信[27]
親投稿
マギー M191246
誤『指定でる 』 正『指定できる』 但し、普通の文字列に対してこの処理を行うと 途中の部分にでたらめなコードの文字が 設定されるので注意が必要です。 (ていうか使用不可?)
0そうだね
プレイ済み
返信[28]
親投稿
マギー M191246
誤『要素数5の配列が』 正『要素数5の配列Aが』 yuyaさんへ。 別の方法をとられたということですし また、すでに確認済みかも知れませんけど。 変数の二重宣言エラーが出るかどうかは、 『何回実行されるか』に関係なく 『プログラムの中に、その指示が いくつあるか』で決まるみたいです。
0そうだね
プレイ済み