Форум: "Начинающим";
Текущий архив: 2006.01.22;
Скачать: [xml.tar.bz2];
ВнизНе правильно работает цикл for Найти похожие ветки
← →
stef © (2005-12-27 06:00) [0]Может кто уже встречался с чем-то подобным
Есть код:var
size:integer;
f:file of TRecDriv;
tmp:TRecDriv;
...
...
size:=filesize(f)-1;
for i:=0 to size do
begin
seek(f,i);
read(f,tmp);
add_sg(inttostr(tmp.TabNumb),tmp.FIO);
end;
В котором, при пустом файле f, в переменную size должно быть присвоено (-1) и тогда цикл не должен выполнится ни разу.
При выполнении программы (при пустом файле) в переменную size действительно попадает значение (-1), но вот цикл начинает почему-то выполнятся.
← →
boalse © (2005-12-27 06:22) [1]А что такое I?
Если это byte или word или Cardinal, то там нижняя граница 0. Значит, даже если size будет отрицательным, то в цикле for i:=0 to size do
I всё равно будет меняться от 0 до 0 и он будет выполняться в любом случае 1 раз. Выбирай I - Integer или тому подобным.
← →
begin...end © (2005-12-27 08:58) [2]> boalse © (27.12.05 06:22) [1]
Если I -- это Byte, Word или Cardinal, а Size = -1, то цикл в [0] выполнится не 1 раз, а 256, 65536 и 4294967296 раз, соответственно.
← →
boalse © (2005-12-27 09:14) [3]
> [2] begin...end © (27.12.05 08:58)
Хе, точно!
← →
Чапаев © (2005-12-27 10:11) [4]
> Значит, даже если size будет отрицательным
...то получим кучу ворнингов. Автор, предупреждения при компиляции были?
← →
begin...end © (2005-12-27 10:13) [5]> Чапаев © (27.12.05 10:11) [4]
Не получим, т.к. size -- это переменная, а не константа.
← →
Deka © (2005-12-27 10:42) [6]Я бы все-таки перед циклом проверку поставил. Оптимизация, конечно, оптимизацией, а надежность все-таки главнее. Поменяют реализацию FOR в будущих версиях Дельфи и ищи потом эту ошибку... А IF как был, так и останется!
← →
beglec © (2005-12-27 11:17) [7]Едрен батон!
учи теорию !!!
С каких пор цикл For? именно FOR стал ни разу не выполняется!?
Во всех учебниках написано
FOR выполняется в любом случае хотя бы раз!
For I:=0 to 0 do - выполняется 1 раз в любом случае
и типы тут не причем. Cardinal и Byte это другий совершенно случай
предлагаю заменить твой цикл на следующее
While i<size do
begin
seek(f,i);
read(f,tmp);
add_sg(inttostr(tmp.TabNumb),tmp.FIO);
end;
вот и все.
P.S. Ну вы блин даете.
← →
TUser © (2005-12-27 11:19) [8]А зачем тут тубу файл с произволльным доступом. Делай while not eof(f) do ...
← →
beglec © (2005-12-27 11:19) [9]Да, конечно предварительно i:=0 :)
← →
boalse © (2005-12-27 11:22) [10]
> учи теорию !!!
Ага, и тебе тогоже.
for I:=0 to -1 do
не выполнится, если I: Integer. Книжкам доверяй, но проверяй!
А вот
for I:=0 Downto -1 do
при тех же условиях один раз выполнится.
← →
MBo © (2005-12-27 12:00) [11]>beglec © (27.12.05 11:17) [7]
Неправильные ты какие-то книжки читал...
boalse © (27.12.05 11:22) [10]
>for I:=0 Downto -1 do
>при тех же условиях один раз выполнится.
Два раза
← →
boalse © (2005-12-27 15:55) [12]
> MBo © (27.12.05 12:00) [11]
Блин, ну конечно же два. Но сути это не меняет.
← →
Johnmen © (2005-12-27 16:00) [13]А в чём суть? B этом?
>beglec © (27.12.05 11:17) [7]
>FOR выполняется в любом случае хотя бы раз!
:)))
← →
The_scorpion © (2005-12-27 16:14) [14]
> С каких пор цикл For? именно FOR стал ни разу не выполняется!
> ?
Со времен арифмометров...:)))
← →
SergP. (2005-12-27 21:42) [15]
> >FOR выполняется в любом случае хотя бы раз!
Не нада....
← →
stef © (2005-12-28 14:43) [16]Спасибо народ за веимание к моей персоне. Цикл я уже заменил, но вопрос остается вопросом без ответа.
Что касается эффекта переполнения переменной, если она типа byte, то это-то я предусмотрел сразу: integer она. Это точно.
Книжки действительно надо читать внимательней всем.
Может глюк какой. Просто мой код до сих пор выполняет цикл от нуля до минус одного.
Я тут подумал, а не мог он (цикл) пойти выполняться в обратную сторону, то есть вроде как вместоto
сработаломdownto
. Вы меня понимаете. Я к сожалению не могу посмотреть, что произойдет после первого же шага (как будет изменяться переменная i) прога сразу вылетает.
Никто с таким приколом не сталкивался?
ЗЫ всех с настыпающим
← →
Johnmen © (2005-12-28 14:57) [17]>stef © (28.12.05 14:43) [16]
Приведи ещё раз код с циклом, объявлением переменных и заголовком процедуры/функции.
← →
The_scorpion © (2005-12-28 20:04) [18]
> но вопрос остается вопросом без ответа.
Цикл for прост как полено, никак вопросов быть не может...
Выполни просьбу господина Johnmen © (28.12.05 14:57) [17] и тебе все объяснят.
← →
vidiv © (2005-12-29 07:16) [19]
> beglec © (27.12.05 11:17) [7]
> While i<size do
> begin
> seek(f,i);
> read(f,tmp);
> add_sg(inttostr(tmp.TabNumb),tmp.FIO);
> end;
если файл будет не пустой, то цикл будет бесконечным... теория блин
← →
beglec © (2005-12-29 07:26) [20]-> vidiv
а ты проверь цикл а я посмотрю на сколько он у тебя бесконечный
i это позиция в файле :)
Size - это размер файла.
то что у него внутри цикла не совсем то, это уже другой вопрос.
а на счет for it:=0 to -1 do признаю был не прав :) Действительно цикл не выполняется
просто никогда такую извращенную формулировку не использовал :)
применял в таких случаях While :)
← →
evvcom © (2005-12-29 09:35) [21]
> просто никогда такую извращенную формулировку не использовал
чем же она извращена? Я имею ввиду, если вместо -1 все же переменная с таким значением. Очень удобно пользоваться.
← →
beglec © (2005-12-29 09:52) [22]Лично я рассуждаю так.
Если цикл нужно выполнять обязательно в любых услових, четкое количество раз тогда for
если цикл выполнять не обязательно или есть хоть бы маленьшая вероятность того, что условия могут не подойти к циклу, тогда делаю While.
Repeat очень и очень редко использую.
Видимо не так мыслю как остальные ;)
← →
evvcom © (2005-12-29 09:56) [23]
> Если цикл нужно выполнять обязательно в любых услових, четкое
> количество раз тогда for
Правильно. Только в нашем случае его надо выполнить 0 раз. Экономим на одном if.
← →
stef © (2005-12-29 12:57) [24]Здравствуйте, уважаемые, не поверите, сегодня утром запустил тот самый код и все само собой заработало. Чест слово ничего там не трогал, специально весь ошибочный код целиком скопировал. Буду переставлять Delphi. Спасибо за помощь. С наступающим
← →
evvcom © (2005-12-29 15:48) [25]
> сегодня утром запустил тот самый код и все само собой заработало.
Ты больше не кури на компутер, просто он был под балдой, вот и вытворял невесть чего.
← →
boalse © (2005-12-30 06:33) [26]
> Буду переставлять Delphi
По-любому дело было не в бобИне...
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.01.22;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.043 c