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

> Прочтите прежде чем задавать вопрос!

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

 
 Ответить  Открыть новую тему 
> Проблема с проверкой в модуле...
priboltik
сообщение 3.03.2007 21:50
Сообщение #1


Пионер
**

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

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


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

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

прога: Прикрепленный файл  PROGRAM4.PAS ( 2.97 килобайт ) Кол-во скачиваний: 310
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 3.03.2007 22:38
Сообщение #2


Гость






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

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

закрываешь файл, который в принципе никогда не может быть открытым, причем делаешь это при {$I-}, и при попытке распечатать результат в Case эта ошибка и выходит наружу...
 К началу страницы 
+ Ответить 
priboltik
сообщение 3.03.2007 23:03
Сообщение #3


Пионер
**

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

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


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

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

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

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



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

Добавлено через 3 мин.
кстати, если при контроль ошибок не выключать, а проверку на IOResult <>0 ставить, то в принципе работать будет???
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 3.03.2007 23:12
Сообщение #4


Гость






Цитата
принципе загвоздка в том что нужно в модуле файл закрывать.
Да... Дело-то все в том, что в модуле ты работаешь с локально описанным файлом, который никак не связан с тем, который описан глобально в основной программе...
Цитата
если при контроль ошибок не выключать, а проверку на IOResult <>0 ставить, то в принципе работать будет???
Нет... Тогда сразу при возникновении ошибки программа прервется. {$I-} маскирует ошибку, чтобы ее можно было проанализировать...
 К началу страницы 
+ Ответить 
priboltik
сообщение 3.03.2007 23:25
Сообщение #5


Пионер
**

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

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


Цитата(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.



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

Сообщение отредактировано: priboltik - 4.03.2007 10:20
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 3.03.2007 23:55
Сообщение #6


Гость






Ты не учитываешь одну очень незначительную деталь:
Цитата(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 0:45
Сообщение #7


Пионер
**

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

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


Все понятно.. спасибо good.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
priboltik
сообщение 4.03.2007 10:18
Сообщение #8


Пионер
**

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

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


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

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

Модуль:Прикрепленный файл  MIKHAL.PAS ( 1.3 килобайт ) Кол-во скачиваний: 307
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 4.03.2007 10:35
Сообщение #9


Гость






Нет, так не пойдет... Ты укажи строки, в которых программа работает неверно, а то там у тебя черт ногу сломит - ничего не разберешь...
 К началу страницы 
+ Ответить 
priboltik
сообщение 4.03.2007 11:26
Сообщение #10


Пионер
**

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

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


Цитата(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 ....препод написал, а доступно объяснить ему было не судьба...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 4.03.2007 11:35
Сообщение #11


Гость






Цитата
вот толко при выводе тех строк, кот. входят в строку, выводится нули..
В приведенных тобой строках НИЧЕГО не выводится...
 К началу страницы 
+ Ответить 
priboltik
сообщение 4.03.2007 13:09
Сообщение #12


Пионер
**

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

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


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

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



в них не выводится.. в них считается и формируется массив..а выводится из него в главной программе...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 4.03.2007 13:22
Сообщение #13


Гость






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

Твою программу же ЧИТАТЬ невозможно, неужели же ты этого не видишь??? mad.gif
 К началу страницы 
+ Ответить 
priboltik
сообщение 4.03.2007 14:32
Сообщение #14


Пионер
**

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

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


кстати.. а если мы берем переменную прямо из модуля,ее не нужно ведь описывать в главной программе..????
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 4.03.2007 14:35
Сообщение #15


Гость






Смотря где она описана в модуле...
 К началу страницы 
+ Ответить 
priboltik
сообщение 4.03.2007 17:18
Сообщение #16


Пионер
**

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

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


описана она в модуле как параметр в функции
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 



- Текстовая версия 20.07.2025 18:39
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"