|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Необъяснимое поведение переменной цикла
Всех с Новым годом!
Проблема следующая: иногда локальная переменная процедуры или функции прямой цикла начинает выдавать значения в обратном порядке. Сталкивался с таким несколько раз, причины найти не смог. В самих процедурах/функциях нет ничего особенного. Например: Код:
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
|
|||
|
|||
отключи оптимизацию.
Это известная "проблема". Если вычисления внутри цикла не зависят от порялка, то оптимизатор "переворачивает" цикл, бо как это более оптимально с точки зрения выполнения машинного кода. |
#3
|
|||
|
|||
Цитата:
Видимо я в гугле не правильно формулировал суть проблемы. В общем-то, "перевернутый" цикл, в данном случае, действительно не влияет на выполнение кода, но я боялся что это результат каких-то скрытых проблем, которые могут проявится позже. |