投稿
おにぎり EasyPuzzler65
多分バグ扱いしないといけない例。このプログラムを実行すると…
2そうだね
プレイ済み
返信[1]
親投稿
おにぎり EasyPuzzler65
こんなふうに配列A,B,Cの記憶域が共有されてしまう。C語ならともかく、BASICではエラーにしないとまずいっしょ。配列変数はローカル宣言ができないらしいことも今回気がついたこと。B=P(A)をCOPY B,P(A)と書けば回避されるのではありますが。
0そうだね
プレイ済み
返信[2]
親投稿
けい kei0baisoku
見た感じ、ポインタBとCを普通にAで上書きしてるみたいですね。 関数から配列を返すのは思いつきませんでした。試した人を見たのも私は初めてかもしれません。この場合、RETURN に配列変数を指定できる点がバグでしょうか。 ローカルの配列変数は宣言できるのですが、グローバル変数と名前が衝突するバグがあるそうです。 前は配列でない普通の変数も名前が衝突していたのですが………
0そうだね
プレイ済み
返信[3]
親投稿
おにぎり EasyPuzzler65
DIM A[2],B[2]とやってB=Aがエラーにならないので、最初はおー代入できるんだ、じゃCOPY命令って何?という感じで いたのですが...あー、配列変数がローカル宣言できないのはバグですか。ムムム。
0そうだね
プレイ済み
返信[4]
親投稿
けい kei0baisoku
えっ、普通の代入も出来るのですか!?(°Д°) 盲点。試そうとも思いませんでした(°ω°) 仕様なら仕組みを把握してる人は活用できない事もないですが、全然BASICらしくないですよね………
0そうだね
プレイ済み
返信[5]
親投稿
おにぎり EasyPuzzler65
もっと簡単でした。まさにポインタ代入になっとるんですな。ぐはっ。
0そうだね
プレイ済み
返信[6]
親投稿
おにぎり EasyPuzzler65
実行画面。
0そうだね
プレイ済み
返信[7]
親投稿
けい kei0baisoku
うーん、予想通り(-ω-) どちらかと言うとバグであって欲しいです。 (=代入できないが正しい)
0そうだね
プレイ済み
返信[8]
親投稿
配列がポインタ渡しできる仕様ですが、自分の場合こんな感じの関数を用意することで配列の再定義に利用してます。 DIM ARR(4) … ARR=INIT_ARR(9) DEF INIT_ARR(N):DIM A[N]:RETURN A:END なお、メモリ開放はきちんと行われてるっぽいです。
0そうだね
プレイ済み
返信[9]
親投稿
けい kei0baisoku
>コア/co.aさん おお!そんなことも(°ω°) Cのローカルスコープのイメージがあるのでローカル変数を関数終了後も持ち続けるのが大丈夫か不安ですが、試した感じちゃんとしてますね……… 引数と保存先変えて複数回呼んでみましたが、衝突せずちゃんと別々に取られてるのを確認できました。
0そうだね
プレイ済み
返信[10]
親投稿
てらこや actorbug
コアさん それって、数値配列だと問題無いのですが、 文字列配列だとメモリーリークするんですよね。 できれば修正してほしいところですが、 マニュアルに載って無いので無理ですかね。
1そうだね
プレイ済み
返信[11]
親投稿
けい kei0baisoku
ローカル変数を持ち続けられるのでガーベジコレクションが働いてると思ったのですが、そう言うわけでも無さそうですね。 文字列以外はプリミティブな型のみが前提の作りになっているのだと思っていましたが、いまいち分からなくなってきてます………(´ω`)
0そうだね
プレイ済み
返信[12]
親投稿
てらこや actorbug
出来合いのガーベジコレクション処理を使わずに、参照カウントを使って自前でメモリ管理しているのだと思います。 自前でやっているから、一部の処理で参照カウントを減らし忘れて、メモリーリークになっているのでしょう。 POP、SHIFT、代入など、数値配列と文字列配列とで共通の処理になっている所でリークしているようなので、そのあたりの考慮漏れだと思います。
1そうだね
プレイ済み