• ベストアンサー

ActivePerl がハングアップ

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

noname#25358
noname#25358
  • Perl
  • 回答数2
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

ソース拝見いたしました。力作ですね。 なかなか複雑なので今回の件に絞って言えば、Perl自体がその手のエラー で異常終了してしまうのは本来あってはならないことですね。 バージョンが最新版(5.6.1.626)でないのなら更新して試してみては どうでしょう?またエラーメッセージがはっきりわかるのならActiveState のBugTrackerで既知のバグかどうか検索してみる手段もありますね。 $CNumはどうやらカーソルの種類によってインクリメントされるだけのよう ですから、不正な値になるとも思えませんし…。 やはりアプリケーション側での対策としては、冗長ではありますが $ExecuteResult[$CNum] = undef if (defined($ExecuteResult[$CNum])); と変更しておくぐらいでしょうか。また、ActivePerlの配列の扱いに 疑いがある場合、@ExecuteResultをハッシュの%ExecuteResultに置き換えて、 消去する場合は delete($ExecuteResult{$CNum}); とする手もあるかと思います。ざっと見たところ@ExecuteResult全体を シーケンシャルにアクセスしているところはないように思えましたので、 ハッシュ化しても問題ないかと。 なにか参考になりましたら幸いです。

noname#25358
質問者

お礼

 返事が遅れてすいません。  いちおー、Perl 自体は最新です。www.perl.comからソースを落としてきてコンパイルしようかなとも思ったんですが、つい最近システムが飛んで以降、VCをインストールしてないもので(笑)  とりあえず、別口からリファレンスは逐一デリファレンスしないとメモリが怪しくなる、という情報をいただいて対処はしてみたんですが、こっちの方も併用して試してみたいと思います。

その他の回答 (1)

noname#9414
noname#9414
回答No.1

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

noname#25358
質問者

お礼

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

関連するQ&A

  • C++ で DIR コマンド

    MS-DOSプロンプトで dir と入力すれば、フォルダ内の 様子がMS-DOSプロンプトに表示されるけど、 C++ で、MS-DOSプロンプトで dir と入力したのと同じ 様にするにはどういうプログラムを作ればいいのですか? 別の言い方で書くと、実行すればMS-DOSプロンプトが 起動し、dir と入力されて dirコマンドが実行される というファイルを作るソースが知りたいんです。 dirコマンドが実行される対象となるディレクトリは どこでもいいんです。 C++ のプログラムでも、ディレクトリ構造を出力することが 出来ると思うんだけど、MS-DOSプロンプトでやってみたいんです。 どうしてそんなことがしたいのかというと、C++ が難しそうだから という理由なんです。 例えば、ファイルコピーを自動化するプログラムを作る時、 C++ のプログラムの出力をMS-DOSプロンプトへ渡す方法を知っていれば、 MS-DOSプロンプトでのコピーは copy コピー元 コピー先 という簡単な書式だから、ファイルコピーを自動化するプログラムも 簡単に作れそうだなと思ったんです。

  • 別プログラムの標準入力に引数を渡す方法

    以下の加算プログラムhoge.plがあります $aaa = <STDIN>; $bbb = <STDIN>; print($aaa+$bbb); hoge.plを別プログラムから以下のように実行し open(OUT,"| hoge.pl"); hoge.plの$aaa、$bbbに値を代入したい場合どのように渡したらよいのでしょうか?

  • MS-DOS(プロンプト?)の起動について

    製造機械でのデータ送信をMS-DOSで行ってます。 いつもはwindows95を起動させてから、すべてのプログラム~MS-DOSって感じで立ち上げてました。 しかし、後輩がMS-DOSプロンプト画面の設定を少しイジってしまったようで・・・ 同じようにMS-DOSを起動させたら、小さい画面が出てきて「このプログラムはMS-DOSモードで実行するように設定されており、ほかのプログラムの動作中には実行できません。続行すると、ほかのプログラムをすべて終了します」と出てきます。 続行するとMS-DOS モードで再起動したような真っ黒な全画面になります。 US/を入力して、コマンドを入力して以前のようにプログラムは起動できます。 設定を元に戻したいのですが、前のようなMS-DOSプロンプト画面になってくれないので設定変更できないのです。 どうすれば、元のMS-DOSプロンプト画面に戻せますか?教えてください。

  • STDINがうまく動きません。

    次のようなスクリプトを書いて、Windows上でDOSプロンプトから scr.pl < aho.txt と実行しましたが何も出力されません。 エラーメッセージなども表示されません。 STDINのpipeが動いていないと思われるのですが、何か書き方に 問題があるのでしょうか? 教えてください。 よろしくお願いします。 #!/usr/bin/perl-w while (<STDIN>) { chomp; print $_; }

    • ベストアンサー
    • Perl
  • Win MeからMS-DOSの実行

    Windows Meになってから、終了時にMS-DOSで再起動することができなくなったのですが、Windows Me上でMS-DOS上のプロンプトを表示してプログラムを実行することは可能でしょうか?

  • DOSモードにならない

    98SEですが、 「スタート」-「WINDOWSの終了」-「MS-DOSモードで再起動する」 これを実行してもDOSプロンプトが表示されません。 画面が真っ暗なままです。 もちろんキーをたたいても何も表示されません。 どこがおかしいと考えられるでしょうか? おねがいします。

  • 起動時にMS-DOSが立ち上がる

    PCを起動してOSが立ち上がった後にMS-DOSプロンプトが立ち上がり (タスクバーにでます)、アクティブ画面(全画面)にすると 「指定されたCOMMAND 検索ディレクトリが正しくありません」とという メッセージが出ます。 「Ctrl + Alt + Del キー」でプログラムを終了するとタスクバーにいったん落ちるのですが、しばらくすると 「プログラムが応答しません。ビジー状態か・・・」とメッセージがでます。 キャンセルで逃げてMS-DOSプロンプトを全画面にすると次のようなメッセージが出ています。 MICROSOFT WINDOWS +-------------------------------------------------+ |ポップアッププログラムサポート +-------------------------------------------------+ |ポップアッププログラムの準備が出来ました。実行が終わったら |Ctrl + C キーを押してこのウィンドウを閉じ,Windowsに戻って下さい +------------------------------------------------ ここでCtrl + Cキーを押してWindowsに戻っています。 毎回このやり方をしています。 MS-DOSプロンプトが立ち上がらないで起動する方法を教えてください。 MS-DOSプロンプトがスタートメニュー⇒プログラム⇒アクセサリの中にありますが、 何か関係があるのでしょうか・・・。 以上、よろしくお願いします。

  • ActivePerlでプログラムを実行するとMS-DOSプロンプトが強制終了する。

    Perlを勉強し始めた者です。 Perlの構築方法等が書かれた本を元にPerlの動く環境を作って早速やって みているのですが、Perlプログラムを実行させるとMS-DOSプロンプトが エラーを発し、DOSウィンドウが強制的に終了させられてしまいます。 その後は再起動をかけないと、同様のエラーが出てDOSウィンドウが 開きません。 これはPerlというよりWindows側の問題のような気もするのですが、何か 解決策がありましたらぜひお願いします。このままですと、Perlでの プログラミングなど到底できません。 以下に私の環境を記します。 OS:Windows Me Perl:ActivePerl ver5.6.1 build 633 httpd:AN HTTPD Browser:Internet Explorer 6.0 エラー内容: (このエラーは別のウィンドウが出てそこに表示されます) 「------------------------------------------------------------- このプログラムで無効な処理が発生したため、強制終了されます。 すべてのプログラムを終了してから、コンピュータを再起動してください。 プログラムで頻繁にエラーが発生する場合は、「スタート」ボタンを クリックして、「ヘルプ」をクリックし、「トラブルシューティング」 の「MS-DOSプログラムに関する問題」を参照して下さい。         [OK]    [詳細(D)] プログラムが無効な操作を実行しようとしました。 エラーが起きたアドレス:06AB:20A6 サービスへの割り込み:なし  -------------------------------------------------------------」 ウィンドウズが起動して初めてPerlプログラムを実行する時はうまく 結果を返します。が、何回か実行させると突然、上のようなエラー メッセージが出てきて強制的にDOSウィンドウが閉じられます。 どなたかこのエラーの回避方法をご存じの方、おられましたらぜひぜひ お教え下さい。宜しくお願いします。

  • コマンドプロンプトでDOSプログラムの文字が表示されない

    XPのコマンドプロンプトで、MS-DOS用プログラムを実行すると、文字が表示されないことがあります。(空行が何行か出てきます) 例えばこのソフトです:http://www.vector.co.jp/soft/dos/util/se004775.html このソフトを実行して文字が表示されなくてもタイムスタンプは変わっていますし、出力をリダイレクトするとファイルに文字が出力されているので、プログラム自体は動作しています。 なお、Win32コンソールアプリの表示は正常です。 これが仕様なのでしょうか。それとも、何か表示する方法があるのでしょうか。

  • MS-DOSプロンプトの使い方

     こんにちは、質問があります。Windows98SEを使っているのですが、その付属のMS-DOSプロンプトを使うにあたって、cd(コマンド)で悩んでいます。普通に、 C:\>cd windows とかで、使っていたのですが、My DocumentsやProgram Filesなど途中で空白が入っているディレクトリなどに移動するときは、cdコマンドを実行すると、 パラメーターが多すぎます とエラーが出て、移動できません。どうやったら、空白の入っているディレクトリにも移動できるようになるのでしょうか? よろしければ教えてください。お願いします。