Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Циклы [D5]


Страницы:   1 2

SergeN ©   (2003-02-03 09:45:00) 

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


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

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


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

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


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

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


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

Заглянем в руководство 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

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


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

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


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

Вот, наконец то добрался до 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. прошу мя вразумить !


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

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


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

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

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


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

Ужас!


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

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


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

var
k: Integer;

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

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


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

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


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

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо