
Ubuntu日本語フォーラム

ログインしていません。
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)
オフライン
う〜〜ん、一応そう言う場合はソース添付してみたほうが良いですよ。
動作確認しないと何か言うのが非常に難しくなるから、です。
(大体、他人のソース読むのも大変なのに、「コード内容が分からない」のなら輪をかけて分かりづらくなります)
あるいはgdb使ってみる、ってのもテかもしれません。
gdb:
http://www.fireproject.jp/feature/gdb/
確か、gpcってgccのフロントエンドだったと思うんで、デバッガ自体は働くのではないでしょうか?
オフライン
ははあ。なるほど。確かに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詳しく無いんで、一旦ロジック洗ってみてください。
オフライン
※規約違反により追放されたユーザの投稿は、ログインユーザにのみ表示されます。
オフライン
ありがとうございます!!
文字コードが問題だったようでEUC-JPに変えるとうまく行きました。
Cametan様 CMasami様 この度は稚拙な日本語にも関わらず的確なアドバイスを下さり、誠にありがとうございました。
PS gdbコマンドはまだ使い方はよくわかりませんが、これからプログラムを書く上で非常に役に立ちそうですね。
これから、使っていこうと思います。
オフライン