Помощь - Поиск - Пользователи - Календарь
Полная версия: Проблема с проверкой в модуле...
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
priboltik
доброго времени суток!
Хотелось бы узнать, почему у меня проверка, котторая стоит в модуле не работает в основной программе..
в частности проверка на наличие файла на диске..

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

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

закрываешь файл, который в принципе никогда не может быть открытым, причем делаешь это при {$I-}, и при попытке распечатать результат в Case эта ошибка и выходит наружу...
priboltik
Цитата(volvo @ 3.03.2007 22:38) *

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

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

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



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

Добавлено через 3 мин.
кстати, если при контроль ошибок не выключать, а проверку на IOResult <>0 ставить, то в принципе работать будет???
volvo
Цитата
принципе загвоздка в том что нужно в модуле файл закрывать.
Да... Дело-то все в том, что в модуле ты работаешь с локально описанным файлом, который никак не связан с тем, который описан глобально в основной программе...
Цитата
если при контроль ошибок не выключать, а проверку на IOResult <>0 ставить, то в принципе работать будет???
Нет... Тогда сразу при возникновении ошибки программа прервется. {$I-} маскирует ошибку, чтобы ее можно было проанализировать...
priboltik
Цитата(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
Ты не учитываешь одну очень незначительную деталь:
Цитата(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
Все понятно.. спасибо good.gif
priboltik
так задача вроде работает..вот толко при выводе тех строк, кот. входят в строку, выводится нули.. не могу понять где ошибка..

прога:Нажмите для просмотра прикрепленного файла
Модуль:Нажмите для просмотра прикрепленного файла
volvo
Нет, так не пойдет... Ты укажи строки, в которых программа работает неверно, а то там у тебя черт ногу сломит - ничего не разберешь...
priboltik
Цитата(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
Цитата
вот толко при выводе тех строк, кот. входят в строку, выводится нули..
В приведенных тобой строках НИЧЕГО не выводится...
priboltik
Цитата(volvo @ 4.03.2007 11:35) *

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



в них не выводится.. в них считается и формируется массив..а выводится из него в главной программе...
volvo
Да блин!!! ПОКАЖИ, ГДЕ?????

Твою программу же ЧИТАТЬ невозможно, неужели же ты этого не видишь??? mad.gif
priboltik
кстати.. а если мы берем переменную прямо из модуля,ее не нужно ведь описывать в главной программе..????
volvo
Смотря где она описана в модуле...
priboltik
описана она в модуле как параметр в функции
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.