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

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

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

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

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

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

Дык по сообщению компилятора получается мне заводить вторую переменную для возврата последнего значения.... Не много ли будет переменных. Ну допустим я исправлюсь и отниму 1, но вторую переменную.....
...
Рейтинг: 0 / 0
Классика
    #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
Классика
    #32158777
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
Весьма странный цикл.

Items начинаются с 0 и заканчиваются (ItemCount-1). А цикл смещен на единицу.
...
Рейтинг: 0 / 0
Классика
    #32158781
Фотография viman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как ни странно но нулевого значения не было. Выдавалась ошибка. компонент tTreeView. Были еще прецеденты, вопрос не в компоненте, а том какого ... цикл начинается с 0 если написано с 1 (и с 10 было даже).
...
Рейтинг: 0 / 0
Классика
    #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
Классика
    #32158866
Oleg_Martynov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Я всегда думал теория гласит вернет 2
Нет. По Вирту, значение переменной цикла после цикла неопределено, и на него нельзя полагаться. Обратим внимание - нигде в описании языка не написано, какое значение будет иметь эта переменная. Использование переменной цикла после цикла (попробовали, какое оно и "догадались") следует рассматривать как потенциально опасный трюк - разработчики компилятора вольны делать что угодно. Допустим, "догадались" - а мы уверены, что так будет во всех случаях? А в другой (следующей, предыдущей) версии компилятора?
Удачи!
...
Рейтинг: 0 / 0
Классика
    #32158881
?пк?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость

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

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


используй while с одной переменной
...
Рейтинг: 0 / 0
Классика
    #32158934
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
Классика
    #32159043
ZrenBy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 SiDen

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

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


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