Имя: Пароль:
IT
Админ
Delphi 7. Цикл For отрабатывает неверно
0 Hazer79
 
25.01.12
11:34
Всем дельфятникам привет.
Помнится был однажды уже такой косяк, но за давностью времени не помню как решил, выручайте.

var b: Integer;
For b := 1 to 19 do begin
... что-то тут делаем
end;

фишка и трабла в том, что цикл начинается не с 1, а с 19.
Пробовал переменную переименовывать, инициализировать до начала цикла, делать другого (byte) типа - всё то же самое.
:-(
1 filh
 
25.01.12
11:36
значит внутри цикла переменная b не задействована.
2 Wobland
 
25.01.12
11:36
>Всем дельфятникам привет.
1Cники идут лесом? ;)

сколько раз цикл делается?

//а не развод ли это?
3 Ковычки
 
25.01.12
11:36
бинарный файл старый ?
4 acsent
 
25.01.12
11:37
не верю
5 skunk
 
25.01.12
11:37
(1)и что?
6 filh
 
25.01.12
11:37
(5) компилятор умный, цикл гоняет в обратном порядке.
7 acsent
 
25.01.12
11:38
(5) если ничего не происходит, то оптимизатор не выполняет цикл
8 Wobland
 
25.01.12
11:39
(7) он же внутри что-то делает
9 sergeante
 
25.01.12
11:40
(0) оптимизатор оптимизирует. В настройках компилятора можно отключить, если принципиально
10 H A D G E H O G s
 
25.01.12
11:41
твои.dcu файлы проекта удали.
11 Hazer79
 
25.01.12
11:41
Тело цикла:

         if Fil_Data[b, 1] = 0 then
           Break
         else begin
           if Fil_Data[b, 1] = Ints[5, a] then begin
             IsExist := True;
             Break;
           end;
         end;
12 Hazer79
 
25.01.12
11:42
+(11) переменная используется
13 VasjaIvanov
 
25.01.12
11:42
(0)у меня такого ни разу не было
14 skunk
 
25.01.12
11:44
(11)и где тут и=1?
15 skunk
 
25.01.12
11:44
смотри чем у тебя иницализированы массивы
16 Hazer79
 
25.01.12
11:45
(14) при чём тут и?
17 VasjaIvanov
 
25.01.12
11:45
(14) причем тут и )))?
18 VasjaIvanov
 
25.01.12
11:45
(16) забавно
19 Hazer79
 
25.01.12
11:45
(16)понял
b Имеется ввиду
я убрал из иницализации, раз всё равно не помогает
20 H A D G E H O G s
 
25.01.12
11:47
(19) А как ты понимаешь, что переменная начинается с 19?
21 VasjaIvanov
 
25.01.12
11:48
if Fil_Data[b, 1] = 0 then begin
           Message(IntToStr(b)); // добавь чтоб посмотреть )))
          Break;
          end;
        else begin
          if Fil_Data[b, 1] = Ints[5, a] then begin
            IsExist := True;
            Break;
          end;
        end;
22 skunk
 
25.01.12
11:48
(16),(17)ломало английский переключать
23 H A D G E H O G s
 
25.01.12
11:49
(21) Локальный массив по умолчанию содержит мусор
24 filh
 
25.01.12
11:50
как вариант

b:=1;
while b < 20 do
 begin
   //что-то тут делаем
   inc(b);
 end;
25 H A D G E H O G s
 
25.01.12
11:50
Message(IntToStr(b)); // добавь чтоб посмотреть )))
if Fil_Data[b, 1] = 0 then begin
         
         Break;
         end;
       else begin
         if Fil_Data[b, 1] = Ints[5, a] then begin
           IsExist := True;
           Break;
         end;
       end;

вот так сделай
26 filh
 
25.01.12
11:50
(20) отлаживает небось и по F7
27 ЧеловекДуши
 
25.01.12
11:50
Бред, все там нормально.
Цикл фор начинает исполнять только при изменении переменной "b" в теле цикла :)
28 VasjaIvanov
 
25.01.12
11:50
скорее всего после break у тебя выскакивает из цикла, тогда вопрос а что ты хотел???
29 VasjaIvanov
 
25.01.12
11:51
(27)бред
30 VasjaIvanov
 
25.01.12
11:52
Цикл всегда исполняется от и до, значение переменой автоматически изменяется
31 NS
 
25.01.12
11:52
IsExist до входа в цикл чему равно?
32 H A D G E H O G s
 
25.01.12
11:53
(26) Локальные счетчики при включенной оптимизации не видны в отладке.
33 H A D G E H O G s
 
25.01.12
11:53
Автор, а можно всех посмотреть?
34 Hazer79
 
25.01.12
11:57
что-то странное
смотрел значения переменных в WatchList. Оттуда и выцепил ошибку.
Добавил по совету (21) ShowMessage в цикл. Значение переменной сразу стало 1.
О_о
Закомментировал ShowMessage - та же самая ошибка. %)

(31) False
(28) смотрю значение ДО Break

DCU стирал - не помогло.

(35) всех - это что?
35 H A D G E H O G s
 
25.01.12
11:58
(34) всех - это что?

Скидывай весь код
36 Hazer79
 
25.01.12
12:02
Procedure Warraws(sg1, sg4 : TAdvStringGrid);
var Counter, a, b : Integer;
   Fil_Data : array[1..19,1..3] of Integer;
   IsExist : Boolean;
begin
For a := 1 to 19 do begin
 Fil_Data[a, 1] := 0;
 Fil_Data[a, 2] := 0;
 Fil_Data[a, 3] := 0;
end;
With sg1 do begin
   Counter := 1;
   For a := 1 to 19 do begin
     if Length(Cells[1, a]) > 0 then begin
     IsExist := False;
       For b := 1 to 19 do begin
         if Fil_Data[b, 1] = 0 then begin
           ShowMessage(IntToStr(b));
           Break
         end
         else begin
           if Fil_Data[b, 1] = Ints[5, a]
             IsExist := True;
             Break;
           end;
         end;
       end;
       if not IsExist then begin
         Fil_Data[Counter, 1] := Ints[5, a] + 100;
         if Cells[6, a] = '-' then
           Fil_Data[Counter, 2] := 500
         else
           Fil_Data[Counter, 2] := Ints[6, a] + 4;
         Fil_Data[Counter, 3] := Ints[3, a ];
         Counter := Counter + 1;
       end;
     end;
   end;
end;
end;
37 H A D G E H O G s
 
25.01.12
12:04
p.s.
For a := 1 to 19 do begin
Fil_Data[a, 1] := 0;
Fil_Data[a, 2] := 0;
Fil_Data[a, 3] := 0;
end;
заменить на
ZeroMemory(@Fil_Data,sizeOf(Fil_Data));
38 Жан Пердежон
 
25.01.12
12:05
(0) ложь и провокация
39 Hazer79
 
25.01.12
12:05
(38) Если бы :-(
40 H A D G E H O G s
 
25.01.12
12:11
(39) Выключи оптимизацию и пересобери проект
41 H A D G E H O G s
 
25.01.12
12:12
Shift+F9
42 H A D G E H O G s
 
25.01.12
12:13
И не "гуляйте в тундре под наркотиками", не отлаживайте под оптимизацией.
Вообще забавные вещи происходят.
43 ЧеловекДуши
 
25.01.12
12:14
(39)Ты переменную "b" когда анализировал, после цикла или в цикле?
Так же, ту не читал про оптимизацию кода, компилятор это делает на автомате, так что советую отрубить оптимизатор и все начнет работать так как ты написал.
44 Жан Пердежон
 
25.01.12
12:16
какие же?
не верю, что оптимизатор такой херней занимается
45 H A D G E H O G s
 
25.01.12
12:21
(44) Отлаживал ВК под 1С, например, при попытке
if Status=1 then begin
Status:=-4; //давал Access Violation,
......


Status - integer;

При оптимизации, выключил - не стало.
46 H A D G E H O G s
 
25.01.12
12:22
(44) Или вообще на точки останова не реагировал, а в лог писал, что dll подключена, да и функции dll 1С-ка выполняла.
47 Hazer79
 
25.01.12
12:26
(40) Спасибо огромное! Помогло! :-)
48 Жан Пердежон
 
25.01.12
12:28
имхо, либо проект не пересобран, либо локальные/глобальные переменные одинаковые имена имеют
(45) тоже подозреваю одинаковые имена)
49 Hazer79
 
25.01.12
12:30
(48) Давал уникальное имя переменной, пересобирал после этого - толку ноль
50 H A D G E H O G s
 
25.01.12
12:50
(48) Ну совсем уж за дятла не держите.