Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

IOResult - с чем это связано?

3.7K
27 ноября 2003 года
Pokblmon
14 / / 27.11.2003
В общем, есть такая чайниковая программа:

_____________________________________________
{$I-}

program Roads;

uses
Crt;

const lim=30;

type mas=array [1..lim] of word;

var
quant:byte;
choice:byte;
road:mas;
k:byte;
ioresultQuant, ioresultLength:integer;


Procedure Intro(var k:byte);
begin
ClrScr;
Writeln('Roads');
Writeln;

Repeat
Writeln('next - enter 1, quit - enter 0');
Readln(k);
Until ((k=0)or(k=1)) and (Ioresult=0);
end;

Procedure ReadQuant(var quant:byte;var ioresultQuant:integer);
begin
ClrScr;
Writeln;
Repeat
Writeln('Enter the quantity of the roads you wish to enter (2-30)');
Readln(quant);
ioresultQuant:=Ioresult;
Until ((quant>=2)and(quant<=30)) and (Ioresult=0);
end;


Procedure ReadLength(quant:byte; var road:mas;var ioresultLength:integer);
Var z:byte;
begin
ClrScr;
z:=0;
Writeln;
Repeat
z:=z+1;
Repeat
Writeln('Please enter length (1..300) of a road number ',z);
Readln(road[z]);
ioresultQuant:=Ioresult;
Until ((road[z]>=1)and(road[z]<=300)) and (Ioresult=0);
Until z=quant;
end;


Procedure SearchMin(quant:byte; var road:mas; var choice:byte);
var i,j:byte;
begin

choice:=1;
for j:=choice+1 to quant do
begin
if road[j]<road[choice] then begin choice:=j; end;
end;
end;

Procedure ChoiceOut(choice:byte; var k:byte);
begin
ClrScr;
Writeln;
Writeln('The driver will choose a road number ', choice);
Writeln;
Repeat
Writeln('reset - enter 1, quit - enter 0');
Readln(k);
Until ((k=0)or(k=1)) and (Ioresult=0);
end;

begin

Intro(k);
If k=1 then
Repeat
ReadQuant(quant,ioresultQuant);
ReadLength(quant, road,ioresultLength);
SearchMin(quant,road,choice);
ChoiceOut(choice,k);
Until k=0;


end.
{$I+}
_________________________________________________

Прошу особое внимание обратить на процедуры ReadQuant и ReadLength, в них как выходные (наряду с другими) используются переменные ioresultQuant и ioresultLength, которым присваивается значение ф-ии IOResult.
Далее: в кажой процедуре имеется цикл (если число введено вне диапазона или осуществлен нецифровой ввод (IOResult<>0)), то запрос на ввод повторяется.

Так вот. В этом ввиде программа работает нормально.
Если же избавиться от этих переменных - ioresultQuant и ioresultLength, которые, по идее, совершенно ни на что не влияют, то при нецифровом вводе в процедуре номер 1 (Intro) - запрос на ввод повторится, и если будет введено правильное значение, то программа вызовет следующую процедуру - ReadQuant, где, при нецифровом вводе программа зависнет (зациклится), хотя условия цикла в процедуре ReadQuant те же, что и в Intro?

Почему так???
6.0K
07 декабря 2003 года
Mitzn
5 / / 06.12.2003
тут у тебя вообще месиво непонятное - что она делаеть?
но я обнаружил что у тебя переменные quant,road[z]
"несоответствие типов" и вообще я паскаль не знаю
2.1K
08 декабря 2003 года
UjinNash
64 / / 29.11.2003
Функция IOResult: Integer возвращает целое число, соответствующее коду последней ошибки ввода-вывода. При нормальном завершении операции функция вернет значение 0. Значение функции IOResult необходимо присваивать какой-либо переменной, так как при каждом вызове функция обнуляет свое значение.
3.7K
09 декабря 2003 года
Pokblmon
14 / / 27.11.2003
Цитата:
Originally posted by UjinNash
Функция IOResult: Integer возвращает целое число, соответствующее коду последней ошибки ввода-вывода. При нормальном завершении операции функция вернет значение 0. Значение функции IOResult необходимо присваивать какой-либо переменной, так как при каждом вызове функция обнуляет свое значение.



А разве, когда я использую ее для сравнения - она не вызывается?

5.4K
15 декабря 2003 года
DarkAng
15 / / 15.12.2003
Функция iorusult имеет внутренние переметры, которые меняются при вызове функции. Поэтому при {$I-} ее желательно вызывать каждый раз полсе обращения к файлу на открытие/чтение/запись и не больше одного раза.

Не знаю, как у тебя там без переменных твоих вспомогательных, но такая фишка:

repeat
...
res:=ioruesult;
until ioresult=0;

не прокатит.

При работе с этой функцией лучше придерживаться следующей схемы:

writeln(f,...);
res:=ioresult;
[работа с res]

или использовать ioresult не больше одного раза после вызова
265
16 декабря 2003 года
Gauss
975 / / 20.02.2000
правильно работать с ioresult вот так:
Код:
var
   a : file of char;
................
assign(f,'myfile.dat');
{$I-} {Отключить контроль ошибок ввода-вывода}
reset(f);
{$I+} {Включить контроль ошибок ввода-вывода}
if IOResult <> 0 then
Begin
.............. {файл не существует}
End
else
Begin
.............. {файл существует}
End;
..............
5.4K
16 декабря 2003 года
DarkAng
15 / / 15.12.2003
Можно и так.
Тогда уж

{$I+}
writeln(f,'smth');
{$I-}
if ioresult<>0 then
begin
...
writeln('error');
halt
end;
...
265
16 декабря 2003 года
Gauss
975 / / 20.02.2000
видишь-ли прежде чем писать в файл его сначала надо открыть и ежели файла нет то получишь ошибку, именно поэтому проверяется открытие файла!
5.4K
16 декабря 2003 года
DarkAng
15 / / 15.12.2003
Цитата:
Originally posted by Gauss
видишь-ли прежде чем писать в файл его сначала надо открыть и ежели файла нет то получишь ошибку, именно поэтому проверяется открытие файла!



Само собой.
При этом одно другому не мешает.

265
16 декабря 2003 года
Gauss
975 / / 20.02.2000
Цитата:
Originally posted by DarkAng


Само собой.
При этом одно другому не мешает.


если удалось открыть файл для записи, дальнейшие проверки не имеют смысла, они всегда будут говорить IOResult=0
Вот если ты его закрываешь и открываешь по новой тогда есть смысл по новой проверять

5.4K
16 декабря 2003 года
DarkAng
15 / / 15.12.2003
Цитата:
Originally posted by Gauss

если удалось открыть файл для записи, дальнейшие проверки не имеют смысла, они всегда будут говорить IOResult=0
Вот если ты его закрываешь и открываешь по новой тогда есть смысл по новой проверять



По-моему, это не совсем так. Насколько я знаю, ioresult связана почти с любой файловой операцией, если включен {$I+}. При writeln или readln тоже может возникнуть ошибка (например, переполнение диска или конец файла соответственно, или просто ошибка чтения/записи на диск).

Так что желательно проверять каждую файловую операцию, кроме, может быть, close. :)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог