![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
Perl で、<STDIN>を繰り返し実行するコマンドライン型のプログラムを作りました。
それをWIn98SEの MS-DOSプロンプト で実行していたのですが、どうも、下記の構文がランダムの確率でハングアップしてしまうようです。
$ExecuteResult[$CNum] = undef;
このとき、@ExecuteResult は多次元配列になっており、この下にある $ExecuteResult[$CNum]->[]->[] もいっしょにクリアしたいわけです。
で、この命令を5~10回ほど繰り返すと、場合によって「メモリがリードになることはできませんでした」というエラーが出てしまいます。ようするに不正領域へアクセスしてしまっているんでしょうが。
これに関して回避策を知っている方がいらっしゃいましたらご意見をいただきたいと思います。
よろしくお願いします。
なお、もし、プログラムのソースを見ていただけるという親切な方がいらっしゃいましたら、こちらを見ていただければと思います。(そんな人いるのかな? うーん(^_^;)
http://www.edit.ne.jp/~deagle/software/se150.lzh
(問題の部分は sql-engine.pl の511行目にあります)
No.2ベストアンサー
- 回答日時:
ソース拝見いたしました。
力作ですね。なかなか複雑なので今回の件に絞って言えば、Perl自体がその手のエラー
で異常終了してしまうのは本来あってはならないことですね。
バージョンが最新版(5.6.1.626)でないのなら更新して試してみては
どうでしょう?またエラーメッセージがはっきりわかるのならActiveState
のBugTrackerで既知のバグかどうか検索してみる手段もありますね。
$CNumはどうやらカーソルの種類によってインクリメントされるだけのよう
ですから、不正な値になるとも思えませんし…。
やはりアプリケーション側での対策としては、冗長ではありますが
$ExecuteResult[$CNum] = undef if (defined($ExecuteResult[$CNum]));
と変更しておくぐらいでしょうか。また、ActivePerlの配列の扱いに
疑いがある場合、@ExecuteResultをハッシュの%ExecuteResultに置き換えて、
消去する場合は
delete($ExecuteResult{$CNum});
とする手もあるかと思います。ざっと見たところ@ExecuteResult全体を
シーケンシャルにアクセスしているところはないように思えましたので、
ハッシュ化しても問題ないかと。
なにか参考になりましたら幸いです。
返事が遅れてすいません。
いちおー、Perl 自体は最新です。www.perl.comからソースを落としてきてコンパイルしようかなとも思ったんですが、つい最近システムが飛んで以降、VCをインストールしてないもので(笑)
とりあえず、別口からリファレンスは逐一デリファレンスしないとメモリが怪しくなる、という情報をいただいて対処はしてみたんですが、こっちの方も併用して試してみたいと思います。
No.1
- 回答日時:
お久しぶりです、deagle様。
えっとですね、Perlに限ったことではないのですが、
不正アクセス・・・というエラーを回避するには、
素直にundefを代入する前に、存在するかどうかを
チェックしてはどうでしょうか?
#Windowsプログラムではこうしますね・・・
ではでは☆
返事が遅れてすいません(^_^;
確実に存在するエリアに対するアクセスしかしてないんです(^_^;
同じ添え字ですでに確保したエリアに対してしかしない動作をしているので。
メモリをたくさん使うので、それでかなとも考えられるんですが……。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語の質問です。 以下の命令を実行するプログラムを作りました ①文字列aとbの長さを表示 ②aとb 1 2022/04/29 15:35
- C言語・C++・C# pythonのファイルの並びでの読み込みとリストについて 4 2022/04/13 03:52
- ノートパソコン Windows 10 動作改善方法 6 2023/04/26 22:30
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- 仕事術・業務効率化 効率的な勉強方法(分野問わず)を教えてください 1 2023/08/16 01:33
- Java Java、配列の問題を教えて欲しいです。 ・日、月、火、水、木、金、土 ・各曜日の英語 を2次元配列 2 2023/07/10 19:14
- PHP ここで言う空文字の意味とは? 1 2022/08/05 16:27
- Windows 10 数年前からWindows10 の Update ができないです。なぜですか? 7 2022/11/09 06:03
- C言語・C++・C# プログラミングの問題です。至急教えてください。 /***から***/の部分をプログラミングにしてほし 1 2022/10/13 11:48
- au(KDDI) 特定の画面を見るとスマホが固まります ご覧頂き有難うございます。 特定のページを見るとスマホが固まり 1 2023/08/21 19:29
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
文字列を変数名として扱う方法
-
ハッシュ検索はなぜ速い
-
列挙型と連想配列の違いを教え...
-
ハッシュ値が一致したデータは...
-
文字列をハッシュにしなければ...
-
CSVファイルにあるメールアドレ...
-
*(アスタリスク)の意味
-
VBAでの一時停止と再開の方法
-
画面を強制的に再描画させる方法
-
VBA横データを縦にしたいです
-
「偶数・奇数の和」のフローチ...
-
VBのReturnの使い方
-
乱数の桁数指定、または範囲指定。
-
VBA 多次元配列を用いてグルー...
-
VBA for i=1 to lastrow
-
乱数と順列と組み合わせ
-
フラグについて
-
VBA Dir関数でファイルをループ...
-
VBAで3秒だけ時間を止めたい
-
データベースをEOFまでループさ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ハッシュ検索はなぜ速い
-
文字列を変数名として扱う方法
-
チェックデジットについて
-
ハッシュのハッシュを実現したい。
-
まったく同じファイルのハッシ...
-
列挙型と連想配列の違いを教え...
-
重複ファイルを削除したいので...
-
*(アスタリスク)の意味
-
短いハッシュの作り方
-
英語でのシャープとコメの呼び...
-
ハッシュマーク以降のアドレス取得
-
一意(ユニーク)かつ、ソート...
-
Perlは戻り値で、ハッシュや配...
-
ハッシュリストって単にハッシ...
-
ActivePerl がハングアップ
-
多次元配列から重複を削除
-
mapのポインタ
-
Perlのハッシュ変数のソートに...
-
Perlのサブルーチンの引数に配...
-
文字数の短いユニークなID生成
おすすめ情報