|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Программа игнорирует строки кода
Создал процедуру, а она неправильно пашет (классическая ситуация), лезу в дебаг и узнаю, что в результате первого прохода цикла
Код:
for l1:=1 to a3[0,0] do Закоментировал всё, оставил только цикл Код:
for l1:=1 to 12 do Удивился, ведь на каждом проходе цикла значение оставалось неизменным 4780080. Поменял обьявление из integer на byte. Теперь мой l1 равнялся 243. Не меняя значения в цикле. Поиском искал другие переменные с тами названием в программе. Не нашел. Груповой заменой поменял на q1, коих в моей проге не было никогда. Результат тот же. Закоментировал весь код процедуры, оставил только Код:
q1:=1; Код всей процедуры целиком прилагается: Код:
function zapusk_procy(f: array of integer):boolean; var q1, q2, q3: byte; g: array [0..100] of integer; begin q1:=1; q2:=2; q3:=3; q3:=4; g[0]:=0; for q1:=1 to a3[0,0] do if f[q1]>0 then begin g[0]:=g[0]+1; g[g[0]]:=f[q1]; end; zapusk_procy:=true; end; Все другие процедуры выполняются адекватно. Сейчас сяду писать новую процедуру, в надежде, что она будет выполтся. Хотел бы узнать Ваше мнение об этой проблеме. |
#2
|
||||
|
||||
Цитата:
|
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
Morik666 (18.11.2013)
|
#3
|
|||
|
|||
Выключил оптимизатор. Не помогло. 4 строчки продолжают игнорироваться.
Код:
q1:=1; q2:=2; q3:=3; q3:=4; Код:
q1:=1; |
#4
|
||||
|
||||
Цитата:
p.s. У себя попробовал твою функцию - после отключения оптимизатора всё полностью компилируется. (Даже не потребовалось полной перекомпилляции) |
#5
|
|||
|
|||
Хм. Судя по всему, оптимизатор выключился не сразу. После третей компиляции делфи прозрел и соизволил заметить мои 4 строчки. И даже цикл начал адекватно работать и менять значения счетчика. Большое спасибо.
Последний раз редактировалось Morik666, 18.11.2013 в 16:26. |
#6
|
|||
|
|||
Цитата:
С чего это она используется? Используется переменная в качестве счетчика цикла. А вот то, что ты туда что-то записал до цикла, при первой же итерации сразу же затирается. Так что компилятор на пару с оптимизатором абсолютно правы. Тут вопрос в другом. С чего ты решил, что сгенерился неправильный код? Если ты написал что-то неправильно (логически), то компилятор тут не причем (да, иногда он переделывает циклы на вычитание, но это, скорее всего, не твой случай). |
#7
|
|||
|
|||
Уважаемый lmikle, полностью согласен с первым параграфом Вашего поста, но смысл второго от меня ускользает. Создается впечетление, что Вы не до конца разобрались в сути проблемы. Изначально проблемой было отсутствие изменений в счетчике при выполнении цикла. На каждой итерации он сохранял свое изначальное значение. В дальнейшем, с целью дебега, были созданы эти 4 злополучные строки. Их целью была попытка изменить значения переменных. Они с поставленной задачей не справились в силу недостатка моей эрудиции. Интерестно то что после выключения оптимизатора и полной перекомпиляции - без каких-либо изменений в коде - программа начала работать как положено.
|
#8
|
|||
|
|||
Смысл второго абзаца в том, что если что-то считается неправильно, то не факт, что это результат неправильной компиляции. Не знаю, какой версией компилятора ты пользуешься, но есть варианты, когда оптимизатор может переделать цикл так, что он выполняется совсем, на первый взгляд, не так, как ты ожидаешь. Очень сильно зависит от остального кода.
|
#9
|
||||
|
||||
Код:
var i: Integer; begin for i:=1 to 12 do begin Sleep(i*0); end; end; все честно: Sleep будет принимать i от 1 до 12. потому что переменная i используется в теле. если заменить Sleep(i*0) на Sleep(0), то i, скорее всего, будет принимать значения от 12 до 1. но это не баг: ведь разработчику не важны значения переменной в теле - ему главное 12 раз выполнить тело и это будет сделано верно. Пишу программы за еду. __________________ |