![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Цикл в цикле принимает неверные начальные значения [D7, WinXP]
kyn66 © (2006-05-17 13:27:00)Вопрос такой, мастера! Я выполняю для проверки цикл в цикле:
for i := 0 to Pred(RxCheckListBox1.Items.Count) do
if RxCheckListBox1.Checked[i] then
begin
DeleteFiles(ListBox1.Items[i] + '*.tmp');
for j := 1 to 5 do
begin
....
end;
end;
В данно случае iпринимает правильно - 0, а вот j, почемуто,принимает значение 5. Почему не понимаю...
Германн (2006-05-19 01:58:00) [1]
> MegaVolt © (18.05.06 18:03) [10]
>
> Когда есть вывод на экран компилятор ведёт счёт с 1 до 5.
> Когда вывода на экран нету например х:=x+i; то компилятор
> ведёт счёт с 5 до 1 так быстрее.
>
Точнее так: Когда есть явноеиспользование значения переменной цикла, оптимизатор компиллятора "молчит в тряпочку". Когда нет - делает так, как считает нужным.
Джо (2006-05-18 23:14:00) [2]> for i:=1 to 5 do
> res:=i;
>
> то по вашему, в переменной res будет 1 ?
В зависимости от того, как дальше используется переменная res (или используется ли вообще). Если не используется, то этот кусок вообще будет выкинут оптимизатором.
TStas (2006-05-18 22:54:00) [3]>Algol Да нет, конечно. Будет 5. Все нормально получается. Я вложенными циклами читал и писал в файл объекты, у которых было SaveToStream и LoadFromStream, если бы что-то не так с циклами было, то они бы просто неверно грузились.
Algol (2006-05-18 18:50:00) [4]
> Когда есть вывод на экран компилятор ведёт счёт с 1 до 5.
> Когда вывода на экран нету например х:=x+i; то компилятор
> ведёт счёт с 5 до 1 так быстрее.
Умный какой компилятор.
То есть, если я напишу
for i:=1 to 5 do
res:=i;
то по вашему, в переменной res будет 1 ?
MegaVolt (2006-05-18 18:03:00) [5]Когда есть вывод на экран компилятор ведёт счёт с 1 до 5. Когда вывода на экран нету например х:=x+i; то компилятор ведёт счёт с 5 до 1 так быстрее.
TStas (2006-05-17 19:22:00) [6]Вот -вот. То же самое и у меня как раз было. Именно расхождение в показаниях отладчика и ShowMessage и именно вложенными циклами. А ветки по это не в первый раз. Все на самом деле нормально получается, компилятор точно не кривой и не глючный
Algol (2006-05-17 15:50:00) [7]
> Но элемент массива он именно пятый и берет, хотя имя файла
> из массива подставляет другое. Совсем непонятно
С чего ты взял, что он берет пятый элемент? Под отладчиком посмотрел значение j? Не верь ему... Поставь в тело цикла ShowMessage(intToStr(j)) и убедишся, что элементы перебираются правильно.
Amoeba (2006-05-17 14:58:00) [8]
> kyn66 © (17.05.06 14:27) [6]
Для приведенного тобой кода не имеет значения, в каком порядке присваиваются значения переменной J и берутся элементы массива. ListBox1.Items и Baza_A ведь не изменяются. Так что на законных основаниях все решает оптимизатор.
kyn66 (2006-05-17 14:27:00) [9]Но элемент массива он именно пятый и берет, хотя имя файла из массива подставляет другое. Совсем непонятно. Вот выкладываю полный код:
...
Baza_A : Array[1..5] of String = ('ROOO.DBF', 'M201.DBF', 'M202.DBF', 'M203.DBF', 'M204.DBF');
...
procedure TMainFrm.OkBtnClick(Sender: TObject);
Var
i, j : Integer;
k : Byte;
begin
Screen.Cursor := crHourGlass;
for i := 0 to Pred(RxCheckListBox1.Items.Count) do
if RxCheckListBox1.Checked[i] then
begin
DeleteFiles(ListBox1.Items[i] + '*.tmp');
for j := Low(Baza_A) to High(Baza_A) do
// for j := 1 to 5 do
begin
if FileExists(ListBox1.Items[i] + Baza_A[j]) then
begin
if DBF1.Active then
DBF1.Close;
DBF1.Exclusive := True;
DBF1.TableName := ListBox1.Items[i] + Baza_A[j];
DBF1.Open;
if DBF1.RecordCount <> 0 then
DBF1.PackTable;
DBF1.Close;
end;
end;
end;
Screen.Cursor := crDefault;
Application.MessageBox(PChar('Ремонт выполнен. Можно продолжать работать.'), PChar(''), MB_OK + MB_ICONASTERISK);
end;
Сергей М. (2006-05-17 14:05:00) [10]
> Может мне именно с первого элемента нужно проверять.
>
Проверку с первого и получишь, не волнуйся, компилятор не подведет.
kyn66 (2006-05-17 13:52:00) [11]А кто решает - важен он или нет? Может мне именно с первого элемента нужно проверять.
MBo (2006-05-17 13:40:00) [12]Если порядок обработки массива не важен, оптимизатор вправе использовать любое направление
kyn66 (2006-05-17 13:34:00) [13]Я просто выбросил ее из вопроса, дальше в цикле она используется для нахождения элемента массива
Сергей М. (2006-05-17 13:29:00) [14]Это работа оптимизатора.
Переменная цикла j нигде в теле цикла не используется.