![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Странная ошибка в for [D6, WinXP]
Pasha L © (2007-01-12 22:11:00)Здравствуйте. Такая вот странная задача:
вызываю
for y:=0 to 2 do
for x:=0 to 9 do
ar[y,x]:=0;
происходит что-то непонятное. Поставил брейкпоинт на заколовок первого цикла, и выясняется, что y принимает сначала значение не 0, а 3. x принимает значение 10. хоть размеры массива ar 0..2 0..9, ошибка не вылазит... потом, в следующем цикле, вообще вылазит ошибка, такая же странная, как эта проблема, так что мне кажется, они имеют одинаковые корни. Давно программирую, но с таким не сталкивался.
sniknik (2007-01-13 00:42:00) [1]Pasha L © (13.01.07 00:20) [24]
ты не домыслы свои высказывай, а давай конкретное, код, текст ошибки.
> игрик принимал абсолютно непонятно откуда берущееся значение
все понятно, что откуда берется, если конечно гадать не приходится.
> так как с помощью игрика я ссылался на элнменты массива
в ПОКАЗАННОМ КОДЕ (сколько раз одно и тоже повторять?) ты не ссылался на с помощью игрека на элементы массива, в показанном, игрек существует только для ограничения цикла, на элементы массива (вернее адрес) указывает какойто регистр, подставленный оптимизатором. т.е. если там и вылезло в y бешенное значение(вот только с чего бы это? точно фазы луны. регистр оборотень попался...) то это количество итераций циклу добавит, и хотя и вызовет ошибку, но не сразу и не от ссылки, а от повторов когда ссылка перевалит через границы массива и "уйдет" в код. либо в защищенную область памяти.
zamtmn (2007-01-13 00:31:00) [2]>> так как с помощью игрика я ссылался на элнменты массива (ar[y,x])
с оптимизацией x,y не учавствуют в обращении к массиву. это просто счетчики цикла. гляди cpu window
>> вдруг, при некоторых значениях икса и игрика, игрик принимал абсолютно непонятно откуда берущееся значение
такого небывает. может ты х или у используешь за пределами цикла? посмотри варнинги. копай, копай:)
Pasha L (2007-01-13 00:20:00) [3]Хотя нет. В самом начале кода программы отрубил оптимизатор - ошибка не вылезает. Она была такая: выполнялся цикл в цикле, и вдруг, при некоторых значениях икса и игрика, игрик принимал абсолютно непонятно откуда берущееся значение, очень большое в сравнении с теми, с которыми я оперирую, и, так как с помощью игрика я ссылался на элнменты массива (ar[y,x]), выползала ошибка. Причем, я долго до этого отлаживал и дополнял программу, этот кусок порграммы выполнялся без проблем.
Pasha L (2007-01-13 00:08:00) [4]sniknik © (12.01.07 23:55) [21]
Да, оптимизатор не имеет ничего общего с последующей ошибкой. Буду копать дальше. Спасибо.
zamtmn (2007-01-13 00:04:00) [5]>>непонимаю я этого (имхо, это из разряда "пальцы погнуть")
никаких пальцев. просто зачем вспоминать при отладке что ты тут писал и додумывать во что это мог превратить компилятор. в [0] всё просто, но бывают случаи посложнее.
>>не фазы луны, а переменные стали используемыми (см. выше) для которых нужны (и оптимизатор дал их) реальные значения.
я имею ввиду не значение переменных, а то что хоть переменные исаользуются хоть нет, массив заполняется так как Pasha L задумал. не выходя за пределы
>>ошибка же вообще с показанным кодом напрямую не связана
тут добавить нечего
sniknik (2007-01-12 23:55:00) [6]ошибка же вообще с показанным кодомнапрямую не связана, может только косвенно (ну типа оператор на соседней строчке с этими...).
sniknik (2007-01-12 23:53:00) [7]> а явсегда работаю с выключеной. включаю только в релиз:).
на работе C-шники, уже не раз сталкивались, что релиз работает не так как дебаг версия.
и отключить там у них, насколько понимаю, это нельзя... просто нужна трассировка пользуй дебаг версию, нужно чтоб быстро - релиз.
но в дельфи то зачем ограничиваться? и то и то доступно одновременно.
непонимаю я этого (имхо, это из разряда "пальцы погнуть").
> и судя по
>> если присваивать не к нулю, а, допучтим, к x+y, то всё в порядке.
> ошибка не только в 17й, а ещеи фазы луны из [2]
не фазы луны, а переменные стали используемыми (см. выше) для которых нужны (и оптимизатор дал их) реальные значения.
zamtmn (2007-01-12 23:44:00) [8]>>но для данного случая описанного в [0] это совершенно лишнее (блин, да я вообще сколько программирую никогда ее не отключал...), ошибка тут не в ней а в 17й строке, имхо.
а явсегда работаю с выключеной. включаю только в релиз:). и судя по
>> если присваивать не к нулю, а, допучтим, к x+y, то всё в порядке.
ошибка не только в 17й, а ещеи фазы луны из [2]
sniknik (2007-01-12 23:36:00) [9]но для данного случая описанного в [0] это совершенно лишнее (блин, да я вообще сколько программирую никогда ее не отключал...), ошибка тут не в ней а в 17й строке, имхо.
Almaz (2007-01-12 23:29:00) [10]
> А можно ли его отключить временно, к примеру, только на
> определенном куске кода?
Можно. Директивой компилятора {$O-}, но не на любом участке кода, а только для выбранной процедуры или функции.
zamtmn (2007-01-12 23:28:00) [11]ох, забыл я что делфи "умеет" оптимизировать... каюсь
>> Да, всё дело оказалось в оптимизаторе, если присваивать не к нулю, а, допучтим, к x+y, то всё в порядке. спасибо. А можно ли его отключить временно, к примеру, только на определенном куске кода?
зачем его отключать, тут ошибка не изза него. заполнение массива всеравно иедет как ты задумал. хоть и показывает 3 и 10, заполняет от 0 до 2 и 0 до 9
Pasha L (2007-01-12 23:26:00) [12]Mr tray и Pasha L это один и тот же человек.
Mr tray (2007-01-12 23:24:00) [13]sniknik © (12.01.07 23:03) [10]
Я не такой ламер, как вам показалось, такой код я могу родить. Да, всё дело оказалось в оптимизаторе, если присваивать не к нулю, а, допучтим, к x+y, то всё в порядке. спасибо. А можно ли его отключить временно, к примеру, только на определенном куске кода?
Almaz (2007-01-12 23:17:00) [14]> теперь 2 раза F8, и дойдешь до описываемой ситуации.
Точно, ты прав. Не пришло мне в голову прокрутить отладчик дальше - смутило упоминание первой строки цикла ;)
Значит таки да - оптимизатор.
sniknik (2007-01-12 23:14:00) [15]> Variable 'X' inaccsessible here due to optimization.
> Variable 'Y' inaccsessible here due to optimization.
а теперь 2 раза F8, и дойдешь до описываемой ситуации.
Almaz (2007-01-12 23:10:00) [16]
> я конечно понимаю что лень, что уверенность, и т.д. но всеже
> - проверь.
Не лень, конечно, но уверенность имеется ;) Проверил. При включенной оптимизации (D6), в исходном варианте (без умножения) получаю, что и ожидал:
Variable 'X' inaccsessible here due to optimization.
Variable 'Y' inaccsessible here due to optimization.
Что я и имел ввиду, говоря, что в этом случае он вообще не получил бы их значения
sniknik (2007-01-12 23:03:00) [17]вот. чтобы вообще не "парится"
procedure TForm1.Button1Click(Sender: TObject);
var
ar: array[0..2, 0..9] of integer;
x, y: integer;
begin
for y:= 0 to 2 do
for x:= 0 to 9 do
ar[y, x]:= 0; //y*x;
end;
sniknik (2007-01-12 23:01:00) [18]> В этом случае он вообще не получил бы их значения, ИМХО.
почему это? для ограничения for они всеже используются... и так, как оптимальнее всего.
я конечно понимаю что лень, что уверенность, и т.д. но всеже - проверь.
Almaz (2007-01-12 22:55:00) [19]
> переменные в данном случае не используются т.к. из индексирования
> массива они тоже выкинуты оптимизатором...
В этом случае он вообще не получил бы их значения, ИМХО.
sniknik (2007-01-12 22:52:00) [20]+
а вот если вот так ar[y, x]:= y*x; то уже используются