2019年01月21日

新パソコンでプログラムが動かない?

 オーツは、中古品のパソコンを3万円で買って、自分なりに各種ソフトをインストールしていきました。
2019.1.18 http://o-tsu.seesaa.net/article/463713148.html
 その途中で、一つのトラブルを経験しました。以下に、自分への記録のためにメモしておきます。
 このトラブルの解決までに数時間〜10時間くらいはかかったと思います。
 オーツが普段使っているソフトの中で、重要なものの一つにメールの送信ソフトがあります。
2016.6.10 http://o-tsu.seesaa.net/article/438821738.html
テキストエディタから自作のプログラムを呼び出し、その自作プログラムが CMAIL Writer
2010.10.12 http://o-tsu.seesaa.net/article/165420044.html
を呼び出す形でメールを送信しています。過去20年、このやり方でメールを送信してきました。
 旧パソコンのファイル類を全部新パソコンにコピーすれば、これらのソフト類も全部動くはずです。ところが自作プログラムの部分でエラーが起こるのです。
  101 (Disk write error.)
のコードが表示されて、プログラムの実行がいきなりアボートされます。旧パソコンでは普通に動作するプログラムが新パソコンでそのままでは動かないということになります。これは深刻なエラーです。
 順次いろいろ探っていきました。メール送信プログラムの途中にチェックポイントを設け、そこまでの実行を見ていくと、コマンドプロンプト画面にメッセージを出すところでエラーが起きていることがわかりました。
 そこで、その部分だけを取り出した短いテストプログラム(pascal)を作りました。以下のようなものです。

program test;
var instr:string;
i,j:integer;
begin
for i:=1 to 4 do
begin
write('データを入れて:');
readln(instr);
writeln('instr=',instr);
for j:=1 to length(instr) do write(instr[j]);
writeln;
end;
end.

 キーボードから読んだ文字列を write 文でコマンドプロンプト画面に書き出す単純なプログラムです。文字列を2回書き出しています。1回目は文字列を一気に書き出し、2回目は1バイトずつ書き出しています。
 これを実行すると、旧パソコンでは何の問題もなく動作します。
 ところが、新パソコンでこれを実行すると、エラーが起きます。入力文字列を半角文字だけにすると正常に実行しますが、全角文字を含む文字列を入れるとエラーが起き、プログラムがアボートされます。まず、ここまでを確認するのに時間がかかりました。まさか半角文字と全角文字で結果が異なるとは思いませんでした。半角ならばうまくいくということに気がついたのは偶然でした。もしもこれに気がつかなければ、解決はずっと長引いたでしょう。
 上述のプログラムでは、最初の writeln 文で入力した文字列を一気に全部出力しています。ここではエラーが起こりません。次に、入力した文字列を1バイトずつ画面に書くようにしています。ここでエラーが起こるのです。「kakikukekoかきくけこ」のようなものを入力データにすると、「か」を出力しようとするところでエラーが起きます。
 同一のプログラム(exe 形式)を二つのパソコンで実行して、結果が違うということを確認しました。何回やっても同じ結果です。
 これは困りました。
 どう考えても、オーツのプログラムの問題というよりは、コマンドプロンプトの設定がまずいのだろうと思いました。
 そこで、コマンドプロンプトのウィンドウの左上のマークをクリックして、新旧パソコンの表示を比較してみました。ほとんど同じ設定になっています。かろうじて違っているところを見つけ、コンソール ウィンドウのプロパティから「簡易編集モード」のチェックを外してみました。しかし、実行結果は変わりませんでした。
 最後の試みとして、新パソコンで「レガシ コンソールを使用する」にチェックし、パソコンを再起動しました。
 これでトラブルが解決しました。上述のテストプログラムが半角文字でも全角文字でも正常に動作することが確認でき、メール送信ソフトも問題なく実行できました。
 いやはや、とんでもなく解決がむずかしいトラブルでした。
 むずかしいポイントはいくつかありました。
 第1に、20年も使ってきた自作プログラムが、実行中にいきなりアボートされる事態になってしまったことです。長期にわたって使ってきたことで、それなりに信頼性があると思われたプログラムですが、こういう事態が発生するとは思いませんでした。
 第2に、処理系として Free Pascal を使っていたことです。ボーランド社の Turbo Pascal のように、どこかの開発元が販売している処理系であれば、その会社に質問する手が使えますが、フリーウェアはその手が使えません。ネットでエラーを検索しようとしても、あまりにも漠然とした事態で、オーツは必要な情報を検索することができませんでした。
 第3に、エラーメッセージの意味が違っていたことです。プログラムの実行中にいきなりアボートされるので、手がかりはそのときのエラーコードしかありませんが、101 としか表示されず、しかも、これは「Disk write error.」であって、今回のトラブル(の原因・直し方)とはかなり距離があるメッセージでした。
 第4に、直接エラーを経験したプログラム(メール送信プログラム)ですが、実はパソコンごとに設定が異なる部分があり、それを外部ファイルからデータの形で与えているのですが、新旧パソコンでその中身が異なります。そのため、このファイルの間違いかと疑われ、その確認に手間取ったという事情があります。
 第5に、自作プログラムであっても、20年も使っていると、中身をかなり忘れているということがあります。今回、450行ほどのソースプログラムを読みながら、かなり新鮮な気持ちでアルゴリズムなどを確認していきました。

 今回のトラブルを解決できたことで、オーツのパソコンに関する知識が深まったことがあります。自作プログラムの場合は、その動作の詳細がすべてプログラムに記述されていますから、トラブルが発生すれば、プログラムをデバッグすることでたいてい直ります。コンピュータは、プログラムが同じであれば、動作も同じはずです。何回実行しても同じ動作を繰り返します。これによって、エラーの原因を探ることもできます。この仕組み自体がすばらしいことであると感じました。
 今回のトラブルは、ある意味で、得がたいすばらしい経験をしたともいえるように思います。
 唯一の不満は、この忙しい時期にこんなトラブルが発生してオーツの時間をとられたことです。新パソコンへの移行を遅らせればよかったのですが、新しいパソコンを買った直後ってやっぱりすぐに使いたくなりますよね。
posted by オーツ at 04:06| Comment(0) | パソコンとIT | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

※ブログオーナーが承認したコメントのみ表示されます。