![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Циклы [D5]
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 в цикле переопределяется?