Версия для печати темы
Форум «Всё о Паскале» _ Теоретические вопросы _ Процесс компиляции,отключение проверки ошибок
Автор: klem4 29.01.2005 21:51
Возникла проблемма.
В программе несколько процедур, все немного запутано, одна процедура в последстыии должна вызвать другую, а та какую нибудть еще и обратно, и еще как нибудь
Но компилятор ругается, если в процедуре B происходит вызов процедуры A
, которая описана выше. Вроде можно отключить процесс проверки ошибок на этапе компиляции, но в этом случае программа будет правильно работать ?
Можно ли как-то установить последовательность компиляции процедур ?
Спасибо.
Автор: volvo 29.01.2005 21:55
klem4
Вообще-то в Паскале принята последовательная компиляция... Хотя я не совсем понял проблему... Пример программы можно?
Автор: Altair 29.01.2005 22:22
Цитата
Но компилятор ругается, если в процедуре B происходит вызов процедуры A
, которая описана выше.
Он бы тогда не ругался!
Автор: klem4 29.01.2005 22:22
Процедура output вызывает процедуру menu, которая описана ниже output, конечно можно все переделать, но не хотелось бы и интересно можно ли что-то сделать в этом случае.
Код
program DataBase;
uses crt;
const n=30;
type
STUD=record
NAME1 : string; {Имя}
NAME2 : string; {Фамилия}
NAME3 : string; {Отчество}
DOB : string; {Дата рождения}
HT : string; {Домашний телефон}
MT : string; {Мобильный телефон}
EMail : string; {E-mail адрес}
ICQ : string; {Номер ICQ}
end;
var
s : stud;
i,all : byte;
studs : array[1..n] of stud;
EndRec : boolean;
file_s : file of stud;
EndInput : boolean;
{-------------------------------------------------}
procedure search;
var nfind:byte;
lastname:string;
SearchPoint:boolean;
Begin
clrscr;
assign(file_s,'Data.dat');
reset(file_s);
writeln('Введите Фамилию для поиска :');
readln(lastname);
SearchPoint:=false;
i:=1;
nfind:=0;
while (not(eof(file_s)))and(not(SearchPoint)) do
begin
read(file_s,s);
with s do
if name2=lastname then
begin
nfind:=i;
SearchPoint:=True;
end;
inc(i);
end;
writeln('nfind=',nfind);
repeat
keypressed;
until keypressed;
exit;
end;
{-------------------------------------------------}
procedure output;
Begin
clrscr;
writeln;
assign(file_s,'Data.dat');
reset(file_s);
i:=1;
while (not(eof(file_s))) do
begin
read(file_s,s);
with s do
begin
writeln(i,'-й студент :');
write('ФИО : ');writeln(name2,' ',name1,' ',name3);
write('Дата рождения :');writeln(dob);
write('Домашний телефон :');writeln(ht);
write('Мобилный телефон :');writeln(mt);
write('ICQ : ');writeln(icq);
write('E-mail : ');writeln(email);
writeln;
inc(i);
end;
end;
close(file_s);
repeat
keypressed;
until keypressed;
menu;
end;
{-------------------------------------------------}
procedure if_next;
var ch:char;
Begin
writeln('Будете вводить еще студента [Y/N] ?');
repeat
ch:=upcase(readkey);
until (ch in ['Y','N']);
clrscr;
if ch in ['Y'] then
begin
inc(i);
inc(all);
EndRec:=true;
end
else
begin
close(file_s);
exit;
EndInput:=true;
end;
end;
{--------------------------------------------------}
procedure menu;
var ch:char;
begin
clrscr;
close(file_s);
writeln('Выберите номер из пункта меню');
writeln;
writeln('1). Просмотр информации');
writeln('2). Поиск');
writeln('3). Редактирование');
writeln('4). Выход');
repeat
ch:=readkey;
until ch in ['1','2','3','4'];
case ch of
'1': output;
'2': search;
'3': exit;
'4': exit;
end;
end;
{--------------------------------------------------}
Begin
clrscr;
assign(file_s,'Data.dat');
reset(file_s);
if not(IOResult<>0) then menu
else
begin
assign(file_s,'Data.dat');
rewrite(file_s);
i:=1;
all:=1;
EndRec:=true;
while (i<=n)and(EndRec) do
with s do
begin
writeln('Введите информацию для ',i,'-го студента');
write('Введите Имя : ');readln(name1);
write('Введите Фамилию : ');readln(name2);
write('Введите Отчество :');readln(name3);
writeln('Введите Дату Рождения');
readln(DOB);
writeln('Введите Номер Домашнего Телефона');
readln(HT);
writeln('Введите Номер Мобильного Телефона');
readln(MT);
writeln('Введите E-mail Адрес');
readln(EMail);
writeln('Введите Номер ICQ');
readln(ICQ);
studs[i]:=s;
write(file_s,s);
EndRec:=false;
if_next;
end;
end;
End.
Автор: klem4 29.01.2005 22:25
Цитата
Он бы тогда не ругался!
Я просто перепутал, которая находится ниже.
Автор: Altair 29.01.2005 22:28
тогда скомпилировать нельзя
Автор: volvo 29.01.2005 22:29
klem4
перед описанием Output поставь
Код
procedure menu; forward;
Oleg_Z Правда? ;)
Автор: volvo 29.01.2005 22:49
klem4
А знаешь почему? Ты обрабатываешь IOResult? А отмену контроля ввода-вывода ты отключил? (я про {$I-}, что-то я этого не заметил...). В ФАКе выложен материал по директивам компилятора, посмотри, там кое-что есть...
Автор: volvo 30.01.2005 1:38
Плюс к этому, у тебя в процедуре Menu закрывается файл... Это прекрасно, когда ты в первый раз заходишь в Menu. Но вот когда ты возвращаешься туда после Search, этот файл уже закрыт. Естественно, что повторное закрытие файла вызывает Run-Time Error.
Тут ты должен выбрать одно из 3-х:
- при выходе из каждой процедуры закрывать открытый файл, и снова открывать его при входе в другую процедуру (если нужно, конечно)...
- у тебя файл описан глобально, так что между вызовами процедур его можно и не закрывать...
- с помощью {$I-} отключать контроль над операциями ввода/вывода при операциях с файлом (так делать не рекомендуется)
Автор: klem4 30.01.2005 20:48
Ну вот. Не очень красиво конечно, но работает вроде как по замыслу, осталось только процедуру редактирования написать и дописать поиск.
Если кто-нибудь обнаружит дикие ошибки сообщите пожалуйста.
Код
program DataBase;
uses crt;
const n=30;
type
STUD=record
NAME1 : string; {Имя}
NAME2 : string; {Фамилия}
NAME3 : string; {Отчество}
DOB : string; {Дата рождения}
HT : string; {Домашний телефон}
MT : string; {Мобильный телефон}
EMail : string; {E-mail адрес}
ICQ : string; {Номер ICQ}
end;
var
s : stud;
i,all : byte;
studs : array[1..n] of stud;
EndRec : boolean;
file_s : file of stud;
EndInput : boolean;
{-------------------------------------------------}
procedure menu; forward;
procedure search;
var nfind:byte;
lastname:string;
SearchPoint:boolean;
Begin
clrscr;
assign(file_s,'Data.dat');
reset(file_s);
writeln('Введите Фамилию для поиска :');
readln(lastname);
SearchPoint:=false;
i:=1;
nfind:=0;
while (not(eof(file_s)))and(not(SearchPoint)) do
begin
read(file_s,s);
with s do
if name2=lastname then
begin
nfind:=i;
SearchPoint:=True;
end;
inc(i);
end;
writeln('nfind=',nfind);
close(file_s);
repeat
keypressed;
until keypressed;
menu;
end;
{-------------------------------------------------}
procedure output;
Begin
clrscr;
writeln;
assign(file_s,'Data.dat');
reset(file_s);
i:=1;
while (not(eof(file_s))) do
begin
read(file_s,s);
with s do
begin
writeln(i,'-й студент :');
write('ФИО : ');writeln(name2,' ',name1,' ',name3);
write('Дата рождения :');writeln(dob);
write('Домашний телефон :');writeln(ht);
write('Мобилный телефон :');writeln(mt);
write('ICQ : ');writeln(icq);
write('E-mail : ');writeln(email);
writeln;
inc(i);
end;
end;
close(file_s);
repeat
keypressed;
until keypressed;
menu;
end;
{-------------------------------------------------}
procedure if_next;
var ch:char;
Begin
writeln('Будете вводить еще студента [Y/N] ?');
repeat
ch:=upcase(readkey);
until (ch in ['Y','N']);
clrscr;
if ch in ['Y'] then
begin
inc(i);
inc(all);
EndRec:=true;
end
else
begin
close(file_s);
exit;
EndInput:=true;
end;
end;
{--------------------------------------------------}
procedure rewr; forward;
procedure menu;
var ch:char;
begin
clrscr;
writeln('Выберите номер из пункта меню');
writeln;
writeln('1). Просмотр информации');
writeln('2). Поиск');
writeln('3). Редактирование');
writeln('4). Выход');
repeat
ch:=readkey;
until ch in ['1','2','3','4'];
case ch of
'1': output;
'2': search;
'3': rewr;
'4': exit;
end;
end;
{--------------------------------------------------}
procedure rewr;
begin
writeln('тут что-то будет');
repeat keypressed;
until keypressed;
menu;
end;
{--------------------------------------------------}
Begin
clrscr;
assign(file_s,'Data.dat');
reset(file_s);
if not(IOResult<>0) then
begin
close(file_s);
menu;
end
else
begin
assign(file_s,'Data.dat');
rewrite(file_s);
i:=1;
all:=1;
EndRec:=true;
while (i<=n)and(EndRec) do
with s do
begin
writeln('Введите информацию для ',i,'-го студента');
write('Введите Имя : ');readln(name1);
write('Введите Фамилию : ');readln(name2);
write('Введите Отчество :');readln(name3);
writeln('Введите Дату Рождения');
readln(DOB);
writeln('Введите Номер Домашнего Телефона');
readln(HT);
writeln('Введите Номер Мобильного Телефона');
readln(MT);
writeln('Введите E-mail Адрес');
readln(EMail);
writeln('Введите Номер ICQ');
readln(ICQ);
studs[i]:=s;
write(file_s,s);
EndRec:=false;
if_next;
end;
end;
End.
Автор: volvo 30.01.2005 21:08
Ну не знаю, как насчет ошибок, а вот условие (в процедуре Search):
Код
while (not(eof(file_s)))and(not(SearchPoint)) do
можно было бы переписать, как:
Код
while not(eof(file_s) or SearchPoint) do
;)
Но это не главное. Ошибка тоже присутствует (основная программа):
Код
assign(file_s,'Data.dat');
reset(file_s);
if not(IOResult<>0) then...
Этот фрагмент закончится аварийно при самом первом запуске (когда еще нет файла "Data.dat"). Исправляем - заключаем Reset в пару соответствующих директив компилятора (заодно исправил и условие, почему тебе так нравится NOT - не понимаю...):
Код
assign(file_s,'Data.dat');
{$I-} reset(file_s); {$I+}
if IOResult = 0 then ...
Вот теперь при отсутствии файла программа не "вылетит", и ты сможешь обработать результат ввода/вывода (IOResult)...
Еще замечу - допишу...
Автор: APAL 30.01.2005 21:29
Кошмар, какое расточительство....
Цитата
type
STUD=record
NAME1 : string; {Имя}
NAME2 : string; {Фамилия}
NAME3 : string; {Отчество}
DOB : string; {Дата рождения}
HT : string; {Домашний телефон}
MT : string; {Мобильный телефон}
EMail : string; {E-mail адрес}
ICQ : string; {Номер ICQ}
end;
а может как нибудь так:
Код
type
STUD=record
NAME1 : stringх[10]; {Имя}
NAME2 : string[15]; {Фамилия}
NAME3 : string[20]; {Отчество}
DOB : string[10]; {Дата рождения}
HT : string[11]; {Домашний телефон}
MT : string[11]; {Мобильный телефон}
EMail : string[30]; {E-mail адрес}
ICQ : string[10]; {Номер ICQ}
end;
Автор: klem4 30.01.2005 21:42
2Apal, учту, исправлю.
2Volvo , учту, исправлю, но! Откомпилировал свою программу, поместил exe-шник в пустую папку, запустил и все работает, ввел инфу, а при следующем запуске уже сразу вывелось Меню. и программа нигде не 'вылетает'.
Автор: volvo 30.01.2005 21:50
klem4
Как видно, у тебя в меню Options -> Compiler отключен пункт "I/O checking"...
А ты уверен, что на том компьютере, где программу будут запускать, будут точно такие же установки IDE, как у тебя? А вот используя директивы ты можешь гарантировать, что все будет так, как ты задумал, независимо от настроек среды...
:yes:
Автор: klem4 30.01.2005 21:56
Я вот что-то не понял, то есть если я на другом компьютере запущу EXE файл
то может вылететь ошибка ?
ЗЫ I/O checking стоит крестик
Автор: volvo 30.01.2005 22:10
Я сейчас запустил EXE (скомпиленный из твоего исходника) в пустой директории - меня выбросило... А когда добавил директивы - все сработало...
Автор: klem4 30.01.2005 22:15
Даа интересно, я исправил, как ты показал, все, пойду философию учить, сдавать 2-го.., спасибо за помошь, я еще вернусь