Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Классика / 22 сообщений из 22, страница 1 из 1
13.05.2003, 15:25
    #32158667
Andrei_A
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Классика
Люди,хочу услышать ваше мнение..
Кто считает как класически должно быть
for i:=0 to 2 do
begin
end;
ShowMessage(IntToStr(i));

Что вернет. Я всегда думал теория гласит вернет 2. Проверяю в делфи - вертается 3..... Я всю жизнь заблуждался????? Есть еще такие люди????
...
Рейтинг: 0 / 0
13.05.2003, 15:40
    #32158696
oleg_e
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Классика
Все правильно
Проверка условия - после инкремента параметра
Насчет " Я всю жизнь заблуждался " - еще не всю! :-)
...
Рейтинг: 0 / 0
13.05.2003, 15:41
    #32158699
?пк?
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Классика
а ты прочти собщения компилятора на использование i после цикла
...
Рейтинг: 0 / 0
13.05.2003, 15:41
    #32158700
viman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Классика
Есть такой баг. Но это еще ерунда.
for x:=10 to 100 do
begin
----
end;
На первой итерации бывает = 0!!!! Было уже несколько раз при большом колве однотипных циклов. Добавлял переменную xx и переименовывал x в xx в этом месте, тогда начинало работать. Вообще бред!
...
Рейтинг: 0 / 0
13.05.2003, 15:48
    #32158714
Alex_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Классика
Posle Okonchania tsikla for peremennaia i po teorii paskalia ne vsegda vozvrashaet pravilnoe znachenia
...
Рейтинг: 0 / 0
13.05.2003, 15:53
    #32158721
YuryCh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Классика
Никакой это не баг!

компилятор волен делать с твоим циклом что пожелает, в целях оптимизации.
Хоть в обратном порядке выполнять...

например:
for x:=1 to 5 do
begin
----
end;
может выполняться from 5 downto 1

в случаях, когда компилятор может решить, что порядок тебе не важен.
Самый простой случай - когда переменная цикла вообще не используется в его теле... просто выполняется определенное количество повторений
...
Рейтинг: 0 / 0
13.05.2003, 15:59
    #32158728
viman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Классика
Ни фига себе, а если у меня вычисления в цикле каком то идут, и при x=0 возникает ясень пень ошибка. Кстати оптимизатор я пробовал отключать, не помогает.
...
Рейтинг: 0 / 0
13.05.2003, 16:07
    #32158744
YuryCh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Классика
"код в студию!" ну и желательно конечно с версией Delphi
...
Рейтинг: 0 / 0
13.05.2003, 16:13
    #32158751
viman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Классика
"код в студию!" это кому относится?
...
Рейтинг: 0 / 0
13.05.2003, 16:18
    #32158762
YuryCh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Классика
2viman:

к тому, у кого
"...при x=0 возникает ясень пень ошибка..."
;-)
...
Рейтинг: 0 / 0
13.05.2003, 16:18
    #32158763
Andrei_A
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Классика
To ?пк?
а ты прочти собщения компилятора на использование i после цикла

Дык по сообщению компилятора получается мне заводить вторую переменную для возврата последнего значения.... Не много ли будет переменных. Ну допустим я исправлюсь и отниму 1, но вторую переменную.....
...
Рейтинг: 0 / 0
13.05.2003, 16:18
    #32158765
viman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Классика
кстати нашел в своем старом коде

var s:string;
xx:integer;
begin
s:=foDicEditGroups.OrgTree.Items[node_sel].text;
xx:=1;
for xx:=1 to node_count do
begin
try
if foDicEditGroups.OrgTree.Items[xx].text=s then
foDicEditGroups.OrgTree.Items[xx].text:=' - ' + foDicEditGroups.OrgTree.Items[xx].text;
except
on etreeviewerror do
end;
end;
end;

Здесь xx стоят именно по описанной выше причине. при x цикл начинался с 0.
x глобальный, хх локальный пришлось заводить.
...
Рейтинг: 0 / 0
13.05.2003, 16:30
    #32158777
eNose
Участник
[не активирован]
[не одобрен]
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Классика
Весьма странный цикл.

Items начинаются с 0 и заканчиваются (ItemCount-1). А цикл смещен на единицу.
...
Рейтинг: 0 / 0
13.05.2003, 16:34
    #32158781
viman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Классика
Как ни странно но нулевого значения не было. Выдавалась ошибка. компонент tTreeView. Были еще прецеденты, вопрос не в компоненте, а том какого ... цикл начинается с 0 если написано с 1 (и с 10 было даже).
...
Рейтинг: 0 / 0
13.05.2003, 17:23
    #32158857
SiDen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Классика
To YuryCh
например:
for x:=1 to 5 do
begin
----
end;
может выполняться from 5 downto 1

-------------------------------
Это откуда такие чудные данные?
Имхо явный бред.

This warning is issued if the value of a for loop control variable is used after the loop.
You can only rely on the final value of a for loop control variable if the loop is left with a goto or exit statement.
...
Рейтинг: 0 / 0
13.05.2003, 17:29
    #32158866
Oleg_Martynov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Классика
>Я всегда думал теория гласит вернет 2
Нет. По Вирту, значение переменной цикла после цикла неопределено, и на него нельзя полагаться. Обратим внимание - нигде в описании языка не написано, какое значение будет иметь эта переменная. Использование переменной цикла после цикла (попробовали, какое оно и "догадались") следует рассматривать как потенциально опасный трюк - разработчики компилятора вольны делать что угодно. Допустим, "догадались" - а мы уверены, что так будет во всех случаях? А в другой (следующей, предыдущей) версии компилятора?
Удачи!
...
Рейтинг: 0 / 0
13.05.2003, 17:35
    #32158881
?пк?
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Классика

To ?пк?
а ты прочти собщения компилятора на использование i после цикла

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


используй while с одной переменной
...
Рейтинг: 0 / 0
13.05.2003, 18:25
    #32158934
fte
fte
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Классика
>> for i:=0 to 2 do
>> begin
------
>> end;
>>ShowMessage(IntToStr(i));
Собственно, в том что "возвращается" 3 нет ничего удивительного
если этот примерчик переписать вот так, то я думаю все будет понятно
i:= 0
while i <= 2 do
begin
inc(i);
end;
т.е. цикл заканчивается при i=3, другое дело использование значения переменной i после окончания цикла! т.к локальные переменные располагаются в стеке и как его (этот самый стек) использует компилятор заранее не известно...
И уж совсем плохо использовать глобальные переменные для счетчика цикла!
Т.е. я имею ввиду, что глобальная переменная может быть изменена в каком-нибудь Event'е и тогда действительно for x:=1 to ... может начинаться с 0 !!!
...
Рейтинг: 0 / 0
13.05.2003, 21:29
    #32159043
ZrenBy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Классика
2 SiDen

>>>>может выполняться from 5 downto 1
>>Это откуда такие чудные данные?
>>Имхо явный бред.

Из анализа дизассемблирования кода
Было как-то очень длинное обсуждение этого вопроса на мастаке.
...
Рейтинг: 0 / 0
14.05.2003, 07:59
    #32159101
eNose
Участник
[не активирован]
[не одобрен]
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Классика
Достаточно немного разбираться в ассемблере, чтобы понять следующее: если в теле цикла не используется цикловая переменная, то в конечном коде ее вообще не будет - этож просто значения регистра.
...
Рейтинг: 0 / 0
14.05.2003, 08:26
    #32159111
SiDen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Классика
ZrenBy: Если в теле цикла переменная цикла не используется, то может быть(тогда все равно как он выполняется), но если она используется, то такого быть принципиально не должно.
Какой код анализировался? Мона его провести...
ЗЫ: А мужики-то не знают
...
Рейтинг: 0 / 0
16.05.2003, 14:01
    #32161779
SmaLL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Классика
А никто не обращал внимания на сообщения компилятора, что переменная для цикла FOR должна быть описана как локальная иначе будут проблемы?
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Классика / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]