Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.01.2017, 17:23
ДмитрийС ДмитрийС вне форума
Прохожий
 
Регистрация: 02.01.2017
Адрес: Екатеринбург
Сообщения: 2
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Необъяснимое поведение переменной цикла

Всех с Новым годом!

Проблема следующая: иногда локальная переменная процедуры или функции прямой цикла начинает выдавать значения в обратном порядке. Сталкивался с таким несколько раз, причины найти не смог.

В самих процедурах/функциях нет ничего особенного.
Например:
Код:
function SearchNearPoint(x_,y_,frame_: integer): integer;
var i_,p1x_,p2x_,p3x_,p1y_,p2y_,p3y_: integer;
    flag_: boolean;
begin
    Result := -1;
    flag_ := false;
    if (frame_ = 1) then begin
        for i_ := 0 to High(ATriangle1) do begin
            flag_ := CheckPointInsideTriangle2(APoint1[ATriangle1[i_].p1].x, APoint1[ATriangle1[i_].p1].y,
                                               APoint1[ATriangle1[i_].p2].x, APoint1[ATriangle1[i_].p2].y,
                                               APoint1[ATriangle1[i_].p3].x, APoint1[ATriangle1[i_].p3].y,
                                               x_,y_);
        end;  
    end;
   .....
end;

Подобного рода процедур у меня много и чаще всего все в порядке - переменная цикла i_ идет от 0 до до High(массив). Но иногда отсчет по непонятной причине идет в обратную сторону от максимального индекса до 0, как если бы это был for i_ := High(массив) downto 0 do begin.

Если, например, в примере выше поменять переменную i_ на любую другую переменную, то проблема останется.
Код:
Но если сделать вот так:
        for z_ := 0 to High(ATriangle1) do begin
            i_ := z_;
            flag_ := CheckPointInsideTriangle2(APoint1[ATriangle1[i_].p1].x, APoint1[ATriangle1[i_].p1].y,
                                               APoint1[ATriangle1[i_].p2].x, APoint1[ATriangle1[i_].p2].y,
                                               APoint1[ATriangle1[i_].p3].x, APoint1[ATriangle1[i_].p3].y,
                                               x_,y_);
        end;  
Админ: Пользуемся тегами при оформлении кода!

то все работает как надо.

Кто с таким сталкивался? В чем может быть проблема?

Последний раз редактировалось Admin, 02.01.2017 в 17:32.
Ответить с цитированием
  #2  
Старый 02.01.2017, 20:48
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

отключи оптимизацию.
Это известная "проблема". Если вычисления внутри цикла не зависят от порялка, то оптимизатор "переворачивает" цикл, бо как это более оптимально с точки зрения выполнения машинного кода.
Ответить с цитированием
  #3  
Старый 02.01.2017, 21:07
ДмитрийС ДмитрийС вне форума
Прохожий
 
Регистрация: 02.01.2017
Адрес: Екатеринбург
Сообщения: 2
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
отключи оптимизацию.
Это известная "проблема". Если вычисления внутри цикла не зависят от порялка, то оптимизатор "переворачивает" цикл, бо как это более оптимально с точки зрения выполнения машинного кода.
Спасибо!

Видимо я в гугле не правильно формулировал суть проблемы.
В общем-то, "перевернутый" цикл, в данном случае, действительно не влияет на выполнение кода, но я боялся что это результат каких-то скрытых проблем, которые могут проявится позже.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 14:33.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter