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

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

Цикл в цикле принимает неверные начальные значения [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 нигде в теле цикла не используется.


Наверх

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