電子書籍の厳選無料作品が豊富!

 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行目にあります)

A 回答 (2件)

ソース拝見いたしました。

力作ですね。
なかなか複雑なので今回の件に絞って言えば、Perl自体がその手のエラー
で異常終了してしまうのは本来あってはならないことですね。
バージョンが最新版(5.6.1.626)でないのなら更新して試してみては
どうでしょう?またエラーメッセージがはっきりわかるのならActiveState
のBugTrackerで既知のバグかどうか検索してみる手段もありますね。

$CNumはどうやらカーソルの種類によってインクリメントされるだけのよう
ですから、不正な値になるとも思えませんし…。
やはりアプリケーション側での対策としては、冗長ではありますが
$ExecuteResult[$CNum] = undef if (defined($ExecuteResult[$CNum]));
と変更しておくぐらいでしょうか。また、ActivePerlの配列の扱いに
疑いがある場合、@ExecuteResultをハッシュの%ExecuteResultに置き換えて、
消去する場合は
delete($ExecuteResult{$CNum});
とする手もあるかと思います。ざっと見たところ@ExecuteResult全体を
シーケンシャルにアクセスしているところはないように思えましたので、
ハッシュ化しても問題ないかと。

なにか参考になりましたら幸いです。
    • good
    • 0
この回答へのお礼

 返事が遅れてすいません。

 いちおー、Perl 自体は最新です。www.perl.comからソースを落としてきてコンパイルしようかなとも思ったんですが、つい最近システムが飛んで以降、VCをインストールしてないもので(笑)

 とりあえず、別口からリファレンスは逐一デリファレンスしないとメモリが怪しくなる、という情報をいただいて対処はしてみたんですが、こっちの方も併用して試してみたいと思います。

お礼日時:2001/05/25 16:41

お久しぶりです、deagle様。



えっとですね、Perlに限ったことではないのですが、
不正アクセス・・・というエラーを回避するには、
素直にundefを代入する前に、存在するかどうかを
チェックしてはどうでしょうか?
#Windowsプログラムではこうしますね・・・

ではでは☆
    • good
    • 0
この回答へのお礼

 返事が遅れてすいません(^_^;

 確実に存在するエリアに対するアクセスしかしてないんです(^_^;
 同じ添え字ですでに確保したエリアに対してしかしない動作をしているので。
 メモリをたくさん使うので、それでかなとも考えられるんですが……。

お礼日時:2001/05/25 16:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!