Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.041 c
9-1123607260
Yegorchic
2005-08-09 21:07
2006.01.22
А загрузить .max файл через GLScene нельзя?


4-1131538341
Spose
2005-11-09 15:12
2006.01.22
Скрыть окно чужого приложения


2-1136526440
general
2006-01-06 08:47
2006.01.22
Глупый вопрос от начинающего


6-1128928444
Profik
2005-10-10 11:14
2006.01.22
WinMessenger


9-1123591873
Monsteria
2005-08-09 16:51
2006.01.22
Индекатор загрузки





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский