Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1147788452
Neo Trinitron
2006-05-16 18:07
2006.06.25
Грамотная обработка ошибки


6-1140017279
Evgenij_
2006-02-15 18:27
2006.06.25
Мак адрес


2-1149599334
Fiallo4ka
2006-06-06 17:08
2006.06.25
ADO


3-1146553131
denmin
2006-05-02 10:58
2006.06.25
Удаляются таблицы paradox при индексации.


2-1149614650
Mr tray
2006-06-06 21:24
2006.06.25
Нужно ли выделять память для #0 в null-terminated string





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский