IPB
ЛогинПароль:

> Правила раздела!

1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!

 
 Ответить  Открыть новую тему 
> Процесс компиляции,отключение проверки ошибок, Процедура вызывает процедуру.
сообщение
Сообщение #1


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Возникла проблемма.

В программе несколько процедур, все немного запутано, одна процедура в последстыии должна вызвать другую, а та какую нибудть еще и обратно, и еще как нибудь smile.gif

Но компилятор ругается, если в процедуре B происходит вызов процедуры A
, которая описана выше. Вроде можно отключить процесс проверки ошибок на этапе компиляции, но в этом случае программа будет правильно работать ?

Можно ли как-то установить последовательность компиляции процедур ?


Спасибо.


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






klem4
Вообще-то в Паскале принята последовательная компиляция... Хотя я не совсем понял проблему... Пример программы можно?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


Цитата
Но компилятор ругается, если в процедуре B происходит вызов процедуры A
, которая описана выше.

Он бы тогда не ругался!


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Процедура 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.


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Цитата
Он бы тогда не ругался!


Я просто перепутал, которая находится ниже.


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


тогда скомпилировать нельзя


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






klem4
перед описанием Output поставь
Код
procedure menu; forward;


Oleg_Z Правда? ;)

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Эхх, плохи мои дела smile.gif
Компилируется -> меню -> Просмотр информации -> выводит информацию, дальше, по замыслу, после нажатия любой клавиши, опять должна выходить в меню, вот тут и настает грандиозный финал smile.gif runtime error sad.gif

и после сёрча тоже хотелось бы меню, но там даже forward уже не катит sad.gif
придется все переделать я чувствую...smile.gif

Надо думать дальше.

Сообщение отредактировано: klem4 -


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






klem4
А знаешь почему? Ты обрабатываешь IOResult? А отмену контроля ввода-вывода ты отключил? (я про {$I-}, что-то я этого не заметил...). В ФАКе выложен материал по директивам компилятора, посмотри, там кое-что есть...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Гость






Плюс к этому, у тебя в процедуре Menu закрывается файл... Это прекрасно, когда ты в первый раз заходишь в Menu. Но вот когда ты возвращаешься туда после Search, этот файл уже закрыт. Естественно, что повторное закрытие файла вызывает Run-Time Error.

Тут ты должен выбрать одно из 3-х:
  • при выходе из каждой процедуры закрывать открытый файл, и снова открывать его при входе в другую процедуру (если нужно, конечно)...
  • у тебя файл описан глобально, так что между вызовами процедур его можно и не закрывать...
  • с помощью {$I-} отключать контроль над операциями ввода/вывода при операциях с файлом (так делать не рекомендуется)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Ну вот. Не очень красиво конечно, но работает вроде как по замыслу, осталось только процедуру редактирования написать и дописать поиск.

Если кто-нибудь обнаружит дикие ошибки smile.gif сообщите пожалуйста.



Код
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.




--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Гость






Ну не знаю, как насчет ошибок, а вот условие (в процедуре 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)...

Еще замечу - допишу...

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Смотрю...
*****

Группа: Пользователи
Сообщений: 1 055
Пол: Мужской
Реальное имя: Пшеничный Алексей Анатольевич

Репутация: -  6  +


Кошмар, какое расточительство.... smile.gif
Цитата
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;


--------------------
Если что-то не делает того, что вы запланировали ему делать - это еще не означает, что оно бесполезно.
--------------------
Прежде, чем задать вопрос - Правила :: FAQ :: Поиск
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


2Apal, учту, исправлю.

2Volvo , учту, исправлю, но! Откомпилировал свою программу, поместил exe-шник в пустую папку, запустил и все работает, ввел инфу, а при следующем запуске уже сразу вывелось Меню. и программа нигде не 'вылетает'.

Сообщение отредактировано: klem4 -


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Гость






klem4

Как видно, у тебя в меню Options -> Compiler отключен пункт "I/O checking"...

А ты уверен, что на том компьютере, где программу будут запускать, будут точно такие же установки IDE, как у тебя? А вот используя директивы ты можешь гарантировать, что все будет так, как ты задумал, независимо от настроек среды...
:yes:

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Я вот что-то не понял, то есть если я на другом компьютере запущу EXE файл
то может вылететь ошибка ?

ЗЫ I/O checking стоит крестик smile.gif

Сообщение отредактировано: klem4 -


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Гость






Я сейчас запустил EXE (скомпиленный из твоего исходника) в пустой директории - меня выбросило... А когда добавил директивы - все сработало...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Даа интересно, я исправил, как ты показал, все, пойду философию учить, сдавать 2-го.., спасибо за помошь, я еще вернусь smile.gif


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 17.10.2021 22:15
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name