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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Perlでハッシュや配列で重複す...
-
Perlは戻り値で、ハッシュや配...
-
チェックデジットについて
-
一意(ユニーク)かつ、ソート...
-
列挙型と連想配列の違いを教え...
-
文字列を変数名として扱う方法
-
英語でのシャープとコメの呼び...
-
CSVファイルにあるメールアドレ...
-
ハッシュ検索はなぜ速い
-
重複ファイルを削除したいので...
-
ハッシュの考え方、使用例を分...
-
ハッシュ値によるファイルの同...
-
画面を強制的に再描画させる方法
-
VBA for i=1 to lastrow
-
DoEventsが必要な理由について
-
クラスに配列を渡す方法
-
VBのReturnの使い方
-
VBA Dir関数でファイルをループ...
-
スレッド起動したフォームを正...
-
Escキーを押すと、中断する時と...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
文字列を変数名として扱う方法
-
ハッシュ検索はなぜ速い
-
チェックデジットについて
-
perl 文字列検索後に指定フィー...
-
perlで配列名を動的に作り出したい
-
列挙型と連想配列の違いを教え...
-
英語でのシャープとコメの呼び...
-
ハッシュのハッシュを実現したい。
-
動的なハッシュの配列を作成したい
-
多次元連想配列の削除
-
多次元配列から重複を削除
-
ハッシュリストって単にハッシ...
-
ハッシュ値が一致したデータは...
-
まったく同じファイルのハッシ...
-
*(アスタリスク)の意味
-
ハッシュマーク以降のアドレス取得
-
Perlのサブルーチンの引数に配...
-
UTF-8で書かれたJSPの日本語文...
-
連想配列のサイズ制限
-
Perlは戻り値で、ハッシュや配...
おすすめ情報