Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.01.22;
Скачать: CL | DM;

Вниз

Не правильно работает цикл 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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.026 c
2-1136486058
Alexander2006
2006-01-05 21:34
2006.01.22
Запуск службы "Messenger"


14-1135706486
Serg1981
2005-12-27 21:01
2006.01.22
Ограничения БД Access


3-1132574911
NiGGa
2005-11-21 15:08
2006.01.22
ADOQuery c ADOConnection ом или без.


4-1131548053
Igor_thief
2005-11-09 17:54
2006.01.22
Работа с реестром чужого пользователя


2-1135916277
pic
2005-12-30 07:17
2006.01.22
как унать родителя