Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.02.13;
Скачать: [xml.tar.bz2];

Вниз

Циклы   Найти похожие ветки 

 
SergeN   (2003-02-03 09:45) [0]

Добрый день! У меня такая прблема:
есть цикл
for i:=0 to strtoint(num_move.Text) do
begin
///////
end;
num_move-это combobox.
Если num_move.Text:=1, то выполняется один раз, если 10 то 15, а если 100 то (ужас!) 1000 раз. Что это за глюк такой, или я считать не умею? Первый раз в цикле использую combobox и на тебе...


 
D   (2003-02-03 09:49) [1]

Проверьте, правильно ли переводится StrToInt
или может, i в цикле переопределяется?


 
SergeN   (2003-02-03 09:54) [2]

D, пер. i в цикле я не трогаю. А по поводу Strtoint сейчас проверю...


 
Digitman   (2003-02-03 09:56) [3]

var
k: Integer;

...
k := strtoint(num_move.Text); // в num_move.Text - число итераций цикла

for i:=0 to k - 1 do
begin
///////
end


 
gsu   (2003-02-03 11:29) [4]

>> Digitman ©
Извиняюсь, но что в D изменится, окромя -1 ?


 
Anatoly Podgoretsky   (2003-02-03 11:36) [5]

Ужас!


 
Digitman   (2003-02-03 11:39) [6]

как это "что" ??

зн-е выражения strtoint(num_move.Text) будет вычисляться всякий раз при проверке условия выхода из цикла. Мало ли чему равно зн-е num_move.Text в момент выполнения проверки ! При первой итерации оно м.б. = "1", при второй - уже "10" (ничто же не мешает изменить где-либо в коде зн-е этого св-ва, в т.ч. и интеракетивно !)


 
gsu   (2003-02-03 11:53) [7]

>> Anatoly Podgoretsky ©
ничего ужасного, даже не стыдно, просто путаюсь с будет константой и будет вычисляться ...


 
gsu   (2003-02-03 15:47) [8]

Вот, наконец то добрался до D, пример:
Исходные данные:
edit1.Text="10"
j: integer: глобальная

procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
begin
j:=0;
for i:=1 to strtoint(edit1.Text) do
begin
inc(j);
if j > 3 then edit1.Text:="15";
end;
caption:=inttostr(j);
end;
Результаты:
edit1.Text = 15
caption = 10
Я не делаю окончательного вывода из этого примера, но:
1. такой пример есть
2. полагаю, что в D в конструкциях такого типа, начальные и конечные значения цикла при входе в него уже становятся константами
3. прошу мя вразумить !


 
DarkGreen   (2003-02-03 16:26) [9]

Не становятся они константами, выражения каждый раз заново вычисляются.


 
palva   (2003-02-03 16:49) [10]

Заглянем в руководство http://www.citforum.ru/programming/bp70_lr/lr7.shtml#14

"Когда начинает выполняться оператор for, начальное и конечное значения определяются один раз, и эти значения сохраняются на протяжении всего выполнения оператора for."

Неужели авторы руководства прикалываются? Проверим на примере:

var
i, k: integer;
begin
k:=3;
for i:=1 to k do begin
if i=2 then k:=4;
writeln(i)
end
end.

Компилятор (Borland Delphi Version 14.0) отработал, но выдал строчку

test.pas(6) Hint: Value assigned to "k" never used

Программа выдала

1
2
3

И кому после этого верить?


 
gsu   (2003-02-03 16:52) [11]

Я про то и говорю, в сях - это не так а вот в паскале, укажите истину, а ?


 
Smithson   (2003-02-03 16:55) [12]

Товарищи! В любой книге по Delphi пишут, что:
1. Переменная цикла не может быть изменена внутри цикла
2. Расчет значения цикла делается один раз до входа в цикл.
3. Оптимизатор оставляет за собой право изменить порядок выполнения цикла.


 
Sha   (2003-02-03 16:57) [13]

Для цикла for - константы, для while и repeat - каждый раз.


 
gsu   (2003-02-03 16:57) [14]

>> Smithson ©

И в чем же я не прав ? см. gsu © (03.02.03 11:29)


 
gsu   (2003-02-03 16:58) [15]

>> Sha ©

И в чем же я не прав ? см. gsu © (03.02.03 11:29)


 
Романов Р.В.   (2003-02-03 17:05) [16]

У меня даже с отключенной оптимизацией strtoint(edit1.Text) в строке
for i:=1 to strtoint(edit1.Text) do

выполняется 1 раз.

DarkGreen, вы на чем проверяли?


 
Sha   (2003-02-03 17:06) [17]

> gsu © (03.02.03 16:58)
>> Sha ©
> И в чем же я не прав ? см. gsu © (03.02.03 11:29)

Ты прав, как никогда :)


 
gsu   (2003-02-03 17:07) [18]

Уря (-:|~


 
Sha   (2003-02-03 17:28) [19]

> Smithson © (03.02.03 16:55)
> Оптимизатор оставляет за собой право изменить порядок выполнения цикла.

Нельзя ли разъяснить, что это значит?
Получается, что я теперь никогда не смогу написать цикл, работающий в нужном мне направлении? Как же тогда сдвинуть элементы массива влево или вправо? Или я неправильно понял?



 
Романов Р.В.   (2003-02-03 17:47) [20]


> Или я неправильно понял?

Ага неправильно.


 
Sha   (2003-02-03 17:52) [21]

2 Романов Р.В. © (03.02.03 17:47)
Т.е. ...............?


 
Smithson   (2003-02-03 18:02) [22]

То есть ежели оптимизатор сочтет, что ему удобнее вместо i := 0 to 100 do сделать i := 100 downto 0 do, то он так и сгенерит.


 
Романов Р.В.   (2003-02-03 18:08) [23]


> Т.е. ...............?

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


 
gsu   (2003-02-03 18:12) [24]

>> Так что результат будет тот который задуман, а решение для некоторых
>> оказывается неожиданным
1. фраза некорректна
2. оптимизатор ни должен делать ничего противоречащего основным конструкциям


 
Sha   (2003-02-03 19:51) [25]

> Smithson © (03.02.03 18:02)
> То есть ежели оптимизатор сочтет, что ему удобнее вместо i := 0 to 100 do
> сделать i := 100 downto 0 do, то он так и сгенерит.

А вот вы о чем...
Оптимизатор для оптимизации цикла имеет право использовать ВРЕМЕННЫЕ переменные, точно также, как и для вычисления выражений. Эти переменыые никакого отношения к ПЕРЕМЕННЫМ ЦИКЛА не имеют. Как он работает с ними и чему они равны программиста интересовать не должно. Ведь нам же неинтересно, как он работает с временными переменными при вычислении выражений. Главное, чтобы внутри цикла оптимизатор из ВРЕМЕННОЙ ПЕРЕМЕННОЙ правильно конструировал значение ПЕРЕМЕННОЙ ЦИКЛА, когда оно нам будет необходимо. Обычно оптимизатор поддерживает эти значения равными, если ПЕРЕМЕННАЯ ЦИКЛА явно используется внутри цикла. В противном случае цикл
for i:=i1 to i2 do... end; преобразуется в
i:=i2-i1; while i>0 do ... dec(i) end;
Вот и все. Так что просто приведенная выше формулировка была неточна.


 
Anatoly Podgoretsky   (2003-02-03 20:01) [26]

gsu © (03.02.03 11:53)
Что хотят то и творят


 
Романов Р.В.   (2003-02-03 20:03) [27]

Хорошо тогда так:
Так что результат будет тот который задуман, а реализация для некоторых оказывается неожиданной


 
Sha   (2003-02-03 20:11) [28]

> Романов Р.В. © (03.02.03 20:03)
> ... а реализация для некоторых оказывается неожиданной

Тогда лучше так:
... а реализация оказывается неожиданной, для тех кто не имеет обычая нажимать Alt-F2 :)




 
gsu   (2003-02-03 20:15) [29]

>> Anatoly Podgoretsky © (03.02.03 20:01)
>> gsu © (03.02.03 11:53)
>> Что хотят то и творят
1. Не понял юмора, может это типа генофонда ? Там, я сек 30 въезжал, тут ...
2. Что хотют, то и делаютъ, если бы ...


 
Anatoly Podgoretsky   (2003-02-03 20:28) [30]

Все эти комментарии для автора, видимо ему все равно, раз не хочет привести воспроизводимый кусок кода, ну или хотя большие подробность.
Просто ужас, что творится, змеи что хотят то и творят эти Борландовцы.


 
gsu   (2003-02-03 20:31) [31]

ААааааааааааааааа, а я то думал, что мне медальку дадут (-:|~


 
Anatoly Podgoretsky   (2003-02-03 20:37) [32]

На палочке


 
DarkGreen   (2003-02-04 05:26) [33]

2 Романов Р.В. ©
Хм... Ты прав, действительно один раз вычисляется, странно...
Проверял на Delphi 6.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.02.13;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.012 c
3-38032
Бук
2003-01-29 08:15
2003.02.13
Какую БД взять?


14-38442
VictorT
2003-01-30 12:23
2003.02.13
О броузерах


14-38519
sancho
2003-01-26 22:30
2003.02.13
Открытое письмо модераторам


7-38607
Shluz
2002-12-09 12:51
2003.02.13
Левый нижний угол экрана


1-38240
Yury
2003-02-04 14:51
2003.02.13
Размеры формы





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский