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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 18.11.2013, 15:46
Morik666 Morik666 вне форума
Прохожий
 
Регистрация: 19.09.2013
Сообщения: 12
Версия Delphi: Delphi 7
Репутация: 10
Вопрос Программа игнорирует строки кода

Создал процедуру, а она неправильно пашет (классическая ситуация), лезу в дебаг и узнаю, что в результате первого прохода цикла
Код:
for l1:=1 to a3[0,0] do
l1 равна 4780080, учитывая, что a3[0,0] равно 11, немного удивился.
Закоментировал всё, оставил только цикл
Код:
for l1:=1 to 12 do
Смотрю на значения l1 в дебагере после каждого прохода цикла.
Удивился, ведь на каждом проходе цикла значение оставалось неизменным 4780080.
Поменял обьявление из integer на byte. Теперь мой l1 равнялся 243. Не меняя значения в цикле.
Поиском искал другие переменные с тами названием в программе. Не нашел. Груповой заменой поменял на q1, коих в моей проге не было никогда. Результат тот же.
Закоментировал весь код процедуры, оставил только
Код:
q1:=1;
При трассеровке компилятор даже не зашел в эту строку. Удивился. Знаете, с права от кода делфи расставляет маленькие синие точечьки, напротив выполняемых строк, напротив присваивания ее не было. Зато появился ворнинг, что "Value assigned to 'q1' never used".
Код всей процедуры целиком прилагается:
Код:
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;
Выполнение проседуры начинается с "g" игнорируя "q".
Все другие процедуры выполняются адекватно. Сейчас сяду писать новую процедуру, в надежде, что она будет выполтся. Хотел бы узнать Ваше мнение об этой проблеме.
Ответить с цитированием
  #2  
Старый 18.11.2013, 15:53
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Morik666
При трассеровке компилятор даже не зашел в эту строку. Удивился. Знаете, с права от кода делфи расставляет маленькие синие точечьки, напротив выполняемых строк, напротив присваивания ее не было. Зато появился ворнинг, что "Value assigned to 'q1' never used".
Да. У компилятора Delphi есть оптимизатор, не вижу ничего в этом удивительного. Оптимизатор по мере своих возможностей выбрасывает бесполезные инструкции и кроме того умеет ещё некоторые преобразования делать. Если тебе это сильно мешает - можешь в настройках Delphi отключить оптимизатор - тогда будет компилироваться тупо как написано.
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
Morik666 (18.11.2013)
  #3  
Старый 18.11.2013, 16:10
Morik666 Morik666 вне форума
Прохожий
 
Регистрация: 19.09.2013
Сообщения: 12
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Выключил оптимизатор. Не помогло. 4 строчки продолжают игнорироваться.
Код:
q1:=1;
q2:=2;
q3:=3;
q3:=4;
Даже если это шалил оптимизатор, то он должен был оставить
Код:
q1:=1;
Дальше по коду она используется.
Ответить с цитированием
  #4  
Старый 18.11.2013, 16:15
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Morik666
Выключил оптимизатор. Не помогло. 4 строчки продолжают игнорироваться.
Код:
q1:=1;
q2:=2;
q3:=3;
q3:=4;
Даже если это шалил оптимизатор, то он должен был оставить
Код:
q1:=1;
Дальше по коду она используется.
Такого не может быть. Либо всё же не отключил оптимизатор, либо же ещё требуется полная перекомпилляция проекта: меню -> Project -> Build All Projects
p.s. У себя попробовал твою функцию - после отключения оптимизатора всё полностью компилируется. (Даже не потребовалось полной перекомпилляции)
Ответить с цитированием
  #5  
Старый 18.11.2013, 16:17
Morik666 Morik666 вне форума
Прохожий
 
Регистрация: 19.09.2013
Сообщения: 12
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Хм. Судя по всему, оптимизатор выключился не сразу. После третей компиляции делфи прозрел и соизволил заметить мои 4 строчки. И даже цикл начал адекватно работать и менять значения счетчика. Большое спасибо.

Последний раз редактировалось Morik666, 18.11.2013 в 16:26.
Ответить с цитированием
  #6  
Старый 18.11.2013, 17:41
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,020
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от Morik666
Выключил оптимизатор. Не помогло. 4 строчки продолжают игнорироваться.
Код:
q1:=1;
q2:=2;
q3:=3;
q3:=4;
Даже если это шалил оптимизатор, то он должен был оставить
Код:
q1:=1;
Дальше по коду она используется.

С чего это она используется? Используется переменная в качестве счетчика цикла. А вот то, что ты туда что-то записал до цикла, при первой же итерации сразу же затирается. Так что компилятор на пару с оптимизатором абсолютно правы.

Тут вопрос в другом. С чего ты решил, что сгенерился неправильный код? Если ты написал что-то неправильно (логически), то компилятор тут не причем (да, иногда он переделывает циклы на вычитание, но это, скорее всего, не твой случай).
Ответить с цитированием
  #7  
Старый 19.11.2013, 01:57
Morik666 Morik666 вне форума
Прохожий
 
Регистрация: 19.09.2013
Сообщения: 12
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Уважаемый lmikle, полностью согласен с первым параграфом Вашего поста, но смысл второго от меня ускользает. Создается впечетление, что Вы не до конца разобрались в сути проблемы. Изначально проблемой было отсутствие изменений в счетчике при выполнении цикла. На каждой итерации он сохранял свое изначальное значение. В дальнейшем, с целью дебега, были созданы эти 4 злополучные строки. Их целью была попытка изменить значения переменных. Они с поставленной задачей не справились в силу недостатка моей эрудиции. Интерестно то что после выключения оптимизатора и полной перекомпиляции - без каких-либо изменений в коде - программа начала работать как положено.
Ответить с цитированием
  #8  
Старый 19.11.2013, 07:22
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,020
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Смысл второго абзаца в том, что если что-то считается неправильно, то не факт, что это результат неправильной компиляции. Не знаю, какой версией компилятора ты пользуешься, но есть варианты, когда оптимизатор может переделать цикл так, что он выполняется совсем, на первый взгляд, не так, как ты ожидаешь. Очень сильно зависит от остального кода.
Ответить с цитированием
  #9  
Старый 19.11.2013, 10:42
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
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 раз выполнить тело и это будет сделано верно.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter