При запуске сортировки (сортировка выполняется по 2му полю программы, т.е. по годам) выскакивает ошибка процессора и паскаль вырубается. Помогите пожалуйста найти ошибку.
Заранее большое спасибо.
procedure sort;
var
f,f1: file of Lekarstva;
s,t,p: Lekarstva;
log: boolean;
k,i,j,n: integer;
a: array [1..10] of Lekarstva ;
z: string;
b: integer;
begin
clrscr;
assign (f,'c:\Lekarstva.dat');
reset (f);
n:=filesize(f);
i:=0;
while not eof(f) do
begin
read (f,s);
a[i]:=s;
i:=i+1;
end;
repeat
log:=true;
for i:=0 to n-2 do
if (a[i].year)>(a[i+1].year) then
begin
b:=a[i].year;
a[i].year:=a[i+1].year;
a[i+1].year:=b;
z:=a[i].name;
a[i].name:=a[i+1].name;
a[i+1].name:=z;
z:=a[i].vipusk;
a[i].vipusk:=a[i+1].vipusk;
a[i+1].vipusk:=z;
z:=a[i].bolesn;
a[i].bolesn:=a[i+1].bolesn;
a[i+1].bolesn:=z;
log:=false
end;
until log;
clrscr;
writeln (Shapka);
for i:=0 to n-1 do
begin
for j:=length(a[i].name) to 20 do
a[i].name:=a[i].name + ' ';
writeln (':',a[i].name,':',a[i].year,':',a[i].vipusk,' :',a[i].bolesn);
end;
close (f);
repeat until keypressed;
end;
Прикрепи, плз, Lekarstva.dat (запакуй в рар-архив, например).
Вот это страшное место:
b:=a[i].year;
a[i].year:=a[i+1].year;
a[i+1].year:=b;
z:=a[i].name;
a[i].name:=a[i+1].name;
a[i+1].name:=z;
z:=a[i].vipusk;
a[i].vipusk:=a[i+1].vipusk;
a[i+1].vipusk:=z;
z:=a[i].bolesn;
a[i].bolesn:=a[i+1].bolesn;
a[i+1].bolesn:=z;
log:=false
Вот это "страшное место" меняется на 3 строки, потому как для того чтобы поменять местами значения записей совсем не обязательно менять местами все ее поля по отдельности... С записью оператор присваивания сработает абсолютно аналогично.
Вот архив с кодом программы и файлом Lekarstva.dat (там всего три записи,но я думаю,для примера работы сойдёт).
Большое спасибо за помощь!
Прикрепленные файлы
pascal_lek.rar ( 2.35 килобайт )
Кол-во скачиваний: 158
По-моему, проблема в самом файле.
Запустила примитивный кусочек на этом файле:
uses crt;
type
Lekarstva=record
name: string [20];
year: integer;
vipusk: string;
bolesn: string;
end;
var curr: lekarstva;
f: file of Lekarstva;
begin
clrscr;
assign(f,'c:\1.dat');
reset(f);
while not(eof (f)) do
begin
read(f,curr);
writeln(curr.name);
end;
readln;
end.
Что-то на самом деле непонятное с файлом... Размер записи (судя по исходнику) = 535 байт, размер файла должен быть ему кратен, однако на самом деле этого не наблюдается.
Так я же код программы приложил к предыдущим постам) Там есть процедура создания самой базы...
procedure create;
var
f: file of Lekarstva;
s: Lekarstva;
b: integer;
begin
clrscr;
assign (f,'c:\lekarstva.dat');
rewrite (f);
repeat
write ('Enter title of medicine ');
readln (s.name);
write ('Enter year of release ');
readln (s.year);
write ('Enter form of release ');
readln (s.vipusk);
write ('Enter sickness ');
readln (s.bolesn);
write (f,s);
write ('Continue? (1-yes, 2-no) ');
readln (b);
until b=2;
close (f);
end;
А теперь внимательно перечитай пост №6... Почему у тебя этого не происходит? А когда я создал новый файл - все прекрасно читается...
Меня терзают смутные сомнения, что я догадался о причине... Ты каким компилятором пользуешься, расскажи?
Создала новый файл.
Стало несколько лучше.
Только в процедуре сортировки не i:=0, а i:=1 нужно. ну и дальше границы циклов переставь...
Всё заработало.
Большое прибольшое спасибо за помощь!!!!!))