Форум: "Основная";
Текущий архив: 2006.06.25;
Скачать: [xml.tar.bz2];
ВнизЦикл в цикле принимает неверные начальные значения Найти похожие ветки
← →
kyn66 © (2006-05-17 13:27) [0]Вопрос такой, мастера! Я выполняю для проверки цикл в цикле:
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-17 13:29) [1]Это работа оптимизатора.
Переменная цикла j нигде в теле цикла не используется.
← →
kyn66 © (2006-05-17 13:34) [2]Я просто выбросил ее из вопроса, дальше в цикле она используется для нахождения элемента массива
← →
MBo © (2006-05-17 13:40) [3]Если порядок обработки массива не важен, оптимизатор вправе использовать любое направление
← →
kyn66 © (2006-05-17 13:52) [4]А кто решает - важен он или нет? Может мне именно с первого элемента нужно проверять.
← →
Сергей М. © (2006-05-17 14:05) [5]
> Может мне именно с первого элемента нужно проверять.
>
Проверку с первого и получишь, не волнуйся, компилятор не подведет.
← →
kyn66 © (2006-05-17 14:27) [6]Но элемент массива он именно пятый и берет, хотя имя файла из массива подставляет другое. Совсем непонятно. Вот выкладываю полный код:
...
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;
← →
Amoeba © (2006-05-17 14:58) [7]
> kyn66 © (17.05.06 14:27) [6]
Для приведенного тобой кода не имеет значения, в каком порядке присваиваются значения переменной J и берутся элементы массива. ListBox1.Items и Baza_A ведь не изменяются. Так что на законных основаниях все решает оптимизатор.
← →
Algol (2006-05-17 15:50) [8]
> Но элемент массива он именно пятый и берет, хотя имя файла
> из массива подставляет другое. Совсем непонятно
С чего ты взял, что он берет пятый элемент? Под отладчиком посмотрел значение j? Не верь ему... Поставь в тело цикла ShowMessage(intToStr(j)) и убедишся, что элементы перебираются правильно.
← →
TStas © (2006-05-17 19:22) [9]Вот -вот. То же самое и у меня как раз было. Именно расхождение в показаниях отладчика и ShowMessage и именно вложенными циклами. А ветки по это не в первый раз. Все на самом деле нормально получается, компилятор точно не кривой и не глючный
← →
MegaVolt © (2006-05-18 18:03) [10]Когда есть вывод на экран компилятор ведёт счёт с 1 до 5. Когда вывода на экран нету например х:=x+i; то компилятор ведёт счёт с 5 до 1 так быстрее.
← →
Algol (2006-05-18 18:50) [11]
> Когда есть вывод на экран компилятор ведёт счёт с 1 до 5.
> Когда вывода на экран нету например х:=x+i; то компилятор
> ведёт счёт с 5 до 1 так быстрее.
Умный какой компилятор.
То есть, если я напишу
for i:=1 to 5 do
res:=i;
то по вашему, в переменной res будет 1 ?
← →
TStas © (2006-05-18 22:54) [12]>Algol Да нет, конечно. Будет 5. Все нормально получается. Я вложенными циклами читал и писал в файл объекты, у которых было SaveToStream и LoadFromStream, если бы что-то не так с циклами было, то они бы просто неверно грузились.
← →
Джо © (2006-05-18 23:14) [13]> for i:=1 to 5 do
> res:=i;
>
> то по вашему, в переменной res будет 1 ?
В зависимости от того, как дальше используется переменная res (или используется ли вообще). Если не используется, то этот кусок вообще будет выкинут оптимизатором.
← →
Германн © (2006-05-19 01:58) [14]
> MegaVolt © (18.05.06 18:03) [10]
>
> Когда есть вывод на экран компилятор ведёт счёт с 1 до 5.
> Когда вывода на экран нету например х:=x+i; то компилятор
> ведёт счёт с 5 до 1 так быстрее.
>
Точнее так: Когда есть явное использование значения переменной цикла, оптимизатор компиллятора "молчит в тряпочку". Когда нет - делает так, как считает нужным.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2006.06.25;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.01 c