お知らせ

  • 利用規約を守って投稿してください。また、よくある質問および投稿の手引きも参照してください。
  • メッセージの投稿にはアカウントが必要です。未登録の方は、ユーザ登録ページからアカウントを作成することができます。

#1 2008-12-07 18:05:32

mino
新しいメンバ
登録日: 2008-12-07

パスカルプログラムのエラーについて

VirtualBox上でubuntuを動かしているのですが、pascalをgpcでコンパイルをして./a.outで起動すると
value out of range (error #300 at 8049e83) というエラーが発生してしまいます。
簡単な'hello'の表示などは通常に動いてくれるのですが、ファイルの操作やレコードを使ったプログラムの場合に出てしまいす。
上のエラーの意味も調べて見ましたがよくわかりませんでした。

ちなみにVirtualBoxで本体のメモリ2GBあるところの400MBを使っています。

よろしくおねがいします。

5340000,大阪府,大阪市都島区,以下に掲載がない場合,0,0,0,0
5340026,大阪府,大阪市都島区,網島町,0,0,0,0
5340013,大阪府,大阪市都島区,内代町,0,0,1,0
5340025,大阪府,大阪市都島区,片町,0,0,1,0

こんな感じの(3000行くらい)txtファイルを読み込んでレコードファイルを出力するプログラムです。

program prepare(input,output,f1,f2);
const
  short=8;long=50;
type
  shortName=packed array[1..short] of char;
  longName=packed array[1..long] of char;
  Adress=
    record
      post:integer;
      prefecture:shortName;
      cities:longName;
      other:longName;
      flag1,flag2,flag3,flag4:integer;
    end;
 
var
  f1:text;
  f2:file of Adress;
  ad:Adress;
  ch:char;
  i,pnum:integer;

procedure readChar(var name:array[l..u:integer] of char);
var i:integer;
begin
  i:=1;
  while not(ch=',') do
  begin
    name[i]:=ch;
    read(f1,ch);
    i:=i+1;
  end;
  read(f1,ch);
end;

procedure readFlag(var flag:integer);
begin
   if ch='1' then flag:=1
   else flag:=0;
end;

begin
  reset(f1,'osaka.euc.txt'); rewrite(f2,'a.txt');
  while not(eof(f1)) do
  begin
    for i:=1 to short do ad.prefecture:=' ';  {レコードの初期化}
    for i:=1 to long do ad.cities:=' ';
    for i:=1 to long do ad.other:=' ';

    pnum:=0;                          {郵便番号}
    for i:=1 to 7 do
    begin
      read(f1,ch);
      pnum:=10*pnum+ord(ch)-ord('0');   
    end;
    ad.post:=pnum;
    read(f1,ch); read(f1,ch);
     
    readChar(ad.prefecture);   {住所}
    readChar(ad.cities);
    readChar(ad.other);

    readFlag(ad.flag1); read(f1,ch); read(f1,ch); {その他}
    readFlag(ad.flag2); read(f1,ch); read(f1,ch);
    readFlag(ad.flag3); read(f1,ch); read(f1,ch);
    readFlag(ad.flag4);

    readln(f1);

    write(f2,ad);
  end;
end.

最後の編集者: mino (2008-12-08 13:05:17)

オフライン

 

#2 2008-12-08 00:34:02

Cametan
メンバ
登録日: 2007-08-12

Re: パスカルプログラムのエラーについて

う〜〜ん、一応そう言う場合はソース添付してみたほうが良いですよ。
動作確認しないと何か言うのが非常に難しくなるから、です。
(大体、他人のソース読むのも大変なのに、「コード内容が分からない」のなら輪をかけて分かりづらくなります)

あるいはgdb使ってみる、ってのもテかもしれません。

gdb:
http://www.fireproject.jp/feature/gdb/

確か、gpcってgccのフロントエンドだったと思うんで、デバッガ自体は働くのではないでしょうか?

オフライン

 

#3 2008-12-08 12:56:59

mino
新しいメンバ
登録日: 2008-12-07

Re: パスカルプログラムのエラーについて

ありがとうございます。
とりあえず、コードをのせてみます。

オフライン

 

#4 2008-12-08 13:55:22

Cametan
メンバ
登録日: 2007-08-12

Re: パスカルプログラムのエラーについて

ははあ。なるほど。確かにgpcでコンパイル出来るけど、エラーが出ますね。

value out of range (error #300 at 8049e83)

って出ます。

ええと、GDBでbreakかけてみたんですが、恐らく、readCharでエラーが出てますね。
もう一回そこ良く見てください。
GDBの結果は以下の通りです。

Breakpoint 2, readChar (l=1, u=8, name=@0x8077ca4) at hoge.pas:25
25    begin
Current language:  auto; currently pascal
(gdb) s
27      while not(ch=',') do
(gdb) s
28      begin
(gdb) s
29        name[i]:=ch;
(gdb) s
30        read(f1,ch);
(gdb) s
25    begin
(gdb) s
27      while not(ch=',') do
(gdb) s
28      begin
(gdb) s
29        name[i]:=ch;
(gdb) s
30        read(f1,ch);
(gdb) s
25    begin
(gdb) s
27      while not(ch=',') do
(gdb) s
28      begin
(gdb) s
29        name[i]:=ch;
(gdb) s
30        read(f1,ch);
(gdb) s
25    begin
(gdb) s
27      while not(ch=',') do
(gdb) s
28      begin
(gdb) s
29        name[i]:=ch;
(gdb) s
30        read(f1,ch);
(gdb) s
25    begin
(gdb) s
27      while not(ch=',') do
(gdb) s
28      begin
(gdb) s
29        name[i]:=ch;
(gdb) s
30        read(f1,ch);
(gdb) s
25    begin
(gdb) s
27      while not(ch=',') do
(gdb) s
28      begin
(gdb) s
29        name[i]:=ch;
(gdb) s
30        read(f1,ch);
(gdb) s
25    begin
(gdb) s
27      while not(ch=',') do
(gdb) s
28      begin
(gdb) s
29        name[i]:=ch;
(gdb) s
30        read(f1,ch);
(gdb) s
25    begin
(gdb) s
27      while not(ch=',') do
(gdb) s
28      begin
(gdb) s
29        name[i]:=ch;
(gdb) s
30        read(f1,ch);
(gdb) s
25    begin
(gdb) s
27      while not(ch=',') do
(gdb) s
28      begin
(gdb) s
/home/cametan/a.out: value out of range (error #300 at 8049e83)

Program exited with code 052.

と、ここでループしてますよね?ここで引っかかってるのです。
僕はPascal詳しく無いんで、一旦ロジック洗ってみてください。

オフライン

 

#5 2008-12-08 19:12:29

CMasami
拒否
From: Utsunomiya
登録日: 2007-12-13

Re: パスカルプログラムのエラーについて

※規約違反により追放されたユーザの投稿は、ログインユーザにのみ表示されます。

オフライン

 

#6 2008-12-08 22:38:37

mino
新しいメンバ
登録日: 2008-12-07

Re: パスカルプログラムのエラーについて

ありがとうございます!!
文字コードが問題だったようでEUC-JPに変えるとうまく行きました。

Cametan様 CMasami様 この度は稚拙な日本語にも関わらず的確なアドバイスを下さり、誠にありがとうございました。

PS gdbコマンドはまだ使い方はよくわかりませんが、これからプログラムを書く上で非常に役に立ちそうですね。
   これから、使っていこうと思います。

オフライン

 

Board footer

Powered by FluxBB