Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.06.25;
Скачать: CL | DM;

Вниз

Цикл в цикле принимает неверные начальные значения   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.039 c
15-1148894966
ольга
2006-05-29 13:29
2006.06.25
Delphi+AutoCad


15-1149163564
tvv
2006-06-01 16:06
2006.06.25
Работа с TBitmap-ом


11-1129318131
Ritter
2005-10-14 23:28
2006.06.25
События мыши в ListView


15-1148288235
atmospheric
2006-05-22 12:57
2006.06.25
Литература для начинающих Delphi?


2-1149653166
Rubey
2006-06-07 08:06
2006.06.25
Ошибка с полем MEMO