Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Проблема с проверкой в модуле...

Автор: priboltik 4.03.2007 1:50

доброго времени суток!
Хотелось бы узнать, почему у меня проверка, котторая стоит в модуле не работает в основной программе..
в частности проверка на наличие файла на диске..

модуль:Прикрепленный файл  MIKHAL.PAS ( 1.23 килобайт ) Кол-во скачиваний: 287

прога: Прикрепленный файл  PROGRAM4.PAS ( 2.97 килобайт ) Кол-во скачиваний: 287

Автор: volvo 4.03.2007 2:38

Что значит "не работает"? Все прекрасно работает, запусти программу пошагово и убедись... Другое дело - что ты здесь:

			{$I-}
err:=main(filename,ret);
close (f); { <--- }
{$I+}
clrscr;

закрываешь файл, который в принципе никогда не может быть открытым, причем делаешь это при {$I-}, и при попытке распечатать результат в Case эта ошибка и выходит наружу...

Автор: priboltik 4.03.2007 3:03

Цитата(volvo @ 3.03.2007 22:38) *

Что значит "не работает"? Все прекрасно работает, запусти программу пошагово и убедись... Другое дело - что ты здесь:

			{$I-}
err:=main(filename,ret);
close (f); { <--- }
{$I+}
clrscr;

закрываешь файл, который в принципе никогда не может быть открытым, причем делаешь это при {$I-}, и при попытке распечатать результат в Case эта ошибка и выходит наружу...



т.е. в принципе загвоздка в том что нужно в модуле файл закрывать. так???

Добавлено через 3 мин.
кстати, если при контроль ошибок не выключать, а проверку на IOResult <>0 ставить, то в принципе работать будет???

Автор: volvo 4.03.2007 3:12

Цитата
принципе загвоздка в том что нужно в модуле файл закрывать.
Да... Дело-то все в том, что в модуле ты работаешь с локально описанным файлом, который никак не связан с тем, который описан глобально в основной программе...
Цитата
если при контроль ошибок не выключать, а проверку на IOResult <>0 ставить, то в принципе работать будет???
Нет... Тогда сразу при возникновении ошибки программа прервется. {$I-} маскирует ошибку, чтобы ее можно было проанализировать...

Автор: priboltik 4.03.2007 3:25

Цитата(volvo @ 3.03.2007 23:12) *

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


это понятно. спасибо..
Цитата(volvo @ 3.03.2007 23:12) *

Нет... Тогда сразу при возникновении ошибки программа прервется. {$I-} маскирует ошибку, чтобы ее можно было проанализировать...



тогда еще вот вопрос:

вот текст..

program h09809;
uses crt;
var
f1:text;
str,name:string;
begin
clrscr;
repeat
writeln('‚ўҐ¤ЁвҐ Ё¬п д ©«  б ббл«ЄЁ¬Ё: ');
readln(name);
{$I-}
assign(f1,name);
reset(f1);
{$I+}
if ioresult<>0 then
begin
clrscr;
writeln('д ©« ­Ґ ­ ©¤Ґ­');
end;

until ioresult=0;
read(f1,str);
close(f1);
readln;
readln;
end.



здесь вроде должо все работать.. а ошибка все равно вылетает....

Автор: volvo 4.03.2007 3:55

Ты не учитываешь одну очень незначительную деталь:

Цитата(TP Help - IOResult)
I/O-checking must be off--{$I-}--to trap I/O errors using IOResult. If an I/O error occurs and I/O-checking is off, all subsequent I/O operations are ignored until a call is made to IOResult. A call to IOResult clears the internal error flag.
То есть здесь:

until ioresult=0; { <--- }

IOResult уже как раз = 0 (ты уже обращался один раз к IOResult, и его значение после обращения было очищено - сброшено в 0), и ты пытаешься читать из файла, которого нет... Решение:

repeat

writeln('file name: '); readln(name);
{$I-}
assign(f1,name); reset(f1);
{$I+}
IOR := ioresult;
if ior<>0 then begin
clrscr; writeln('file not found');
end;
writeln;

until ior=0;


Автор: priboltik 4.03.2007 4:45

Все понятно.. спасибо good.gif

Автор: priboltik 4.03.2007 14:18

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

прога:Прикрепленный файл  PROGRAM4.PAS ( 2.98 килобайт ) Кол-во скачиваний: 282

Модуль:Прикрепленный файл  MIKHAL.PAS ( 1.3 килобайт ) Кол-во скачиваний: 273

Автор: volvo 4.03.2007 14:35

Нет, так не пойдет... Ты укажи строки, в которых программа работает неверно, а то там у тебя черт ногу сломит - ничего не разберешь...

Автор: priboltik 4.03.2007 15:26

Цитата(volvo @ 4.03.2007 10:35) *

Нет, так не пойдет... Ты укажи строки, в которых программа работает неверно, а то там у тебя черт ногу сломит - ничего не разберешь...




скорее всего где-то здесь
Cifr[i] := Cifr[i] + 1;


и наверное здесь:

if filesize(f)=0 then main:=-3 {pustoy fail}
else
begin
max:=cifr[0];
for i := 0 to 9 do
if Cifr[i] > max then begin max := Cifr[i];
Main := 0;
ret := max;
end;
if max=cifr[0] then main:=-4; {cifirki koroche net}


если честно, не очень понимаю, как это здесь делается.. и для чего вообще нужен массив Cifr ....препод написал, а доступно объяснить ему было не судьба...

Автор: volvo 4.03.2007 15:35

Цитата
вот толко при выводе тех строк, кот. входят в строку, выводится нули..
В приведенных тобой строках НИЧЕГО не выводится...

Автор: priboltik 4.03.2007 17:09

Цитата(volvo @ 4.03.2007 11:35) *

В приведенных тобой строках НИЧЕГО не выводится...



в них не выводится.. в них считается и формируется массив..а выводится из него в главной программе...

Автор: volvo 4.03.2007 17:22

Да блин!!! ПОКАЖИ, ГДЕ?????

Твою программу же ЧИТАТЬ невозможно, неужели же ты этого не видишь??? mad.gif

Автор: priboltik 4.03.2007 18:32

кстати.. а если мы берем переменную прямо из модуля,ее не нужно ведь описывать в главной программе..????

Автор: volvo 4.03.2007 18:35

Смотря где она описана в модуле...

Автор: priboltik 4.03.2007 21:18

описана она в модуле как параметр в функции