Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.04.13;
Скачать: CL | DM;

Вниз

Компилятор пропускает команду...   Найти похожие ветки 

 
HelloEverybody ©   (2008-03-13 19:01) [0]

Всем доброго времени суток! :)
Не первый раз сталкиваюсь с проблемой в Delphi, когда компилятор в процессе отладки (да и вообще) пропускает команду. Например в

procedure UpdateGraph(Anum, Number:integer);
var
   ...
   num,i,j,maxi,jend:integer;
   ...
begin
...
  i:=0;
  j:=0;
...

Он переменной i присваивает ноль, а переменной j нет. В отладчике вообще пропускает эту строчку. При этом не ругается, как будто все в порядке... никак не пойму в чем дело?
Буду благодарен за совет!


 
Сергей М. ©   (2008-03-13 19:20) [1]

Отключи в свойствах проекта оптимизацию. Удивись.


 
{RASkov} ©   (2008-03-13 19:27) [2]

Отключать собственно ничего не нужно, но нужно читать варнинги и "вкуривать" происходящее ;)


 
Leonid Troyanovsky ©   (2008-03-13 19:32) [3]


> {RASkov} ©   (13.03.08 19:27) [2]

> и "вкуривать" происходящее ;)

подсветив оный варнинг и жамкнув F1 :)

--
Regards, LVT.


 
Johnmen ©   (2008-03-13 19:51) [4]

Варнингов может и не быть в данном случае.


 
sniknik ©   (2008-03-13 20:14) [5]

> Буду благодарен за совет!
просто не нужно делать бессмысленных действий/присваиваний, присвоил чтото переменной? используй ее! и все станет на свои места. а оптимизатор лучше не трогать.


 
Семеныч   (2008-03-14 07:02) [6]

> HelloEverybody ©   (13.03.08 19:01)

Чтоб стало совсем понятно. У Вас получается что-то вроде этого: сначала переменной j присваивается ноль, а потом какое-то другое значение (явно или неявно) - и между этими двумя присвоениями переменная j никак не используется.

Ясно, что в этом случае присвоение j:=0 смысла не имеет. Оптимизирующий компилятор Delphi это обнаруживает и из кода его выбрасывает. Сообщение об ошибке он в таких случаях не выдает (потому что ошибки в программе и правда нет, а ошибки в логике программиста компилятор оставляет на его же совести), но выдает замечание (hint) или предупреждение (warning).

Которые обязательно нужно читать. И обязательно нужно добиваться того, чтобы их тоже не было. Иначе есть немалый шанс заполучить в программе баги, да еще и трудноуловимые.


 
Dimaxx ©   (2008-03-14 13:59) [7]

Кстати, подобное замечал. В процедуре использую локальную переменную не инициализируя ее (не пишу j:=0). Дельфи выдает предупреждение, что переменная не инициализирована. Лана, ставлю j:=0 - предупреждения нет.


> ...сначала переменной j присваивается ноль, а потом какое-то
> другое значение (явно или неявно) - и между этими двумя
> присвоениями переменная j никак не используется.
> Ясно, что в этом случае присвоение j:=0 смысла не имеет.
> Оптимизирующий компилятор Delphi это обнаруживает и из
> кода его выбрасывает.


Тогда на кой леший сигнализировать об отсутствии j:=0, если оптимизатор выкинет из кода это присваивание??


 
Плохиш ©   (2008-03-14 14:21) [8]


> Dimaxx ©   (14.03.08 13:59) [7]

Ты вообще понял о чём Семеныч писал? Или так а бы ляпнуть чего?


 
{RASkov} ©   (2008-03-14 14:31) [9]

> [7] Dimaxx ©   (14.03.08 13:59)

var i: Integer
begin
 i:=0;  //ни к чему hint от компилятора
 I:=x+y;
..................
var i: Integer
begin
 X:=I+y; // не инициализирована варнинг от компилятора
..................
var i: integer
begin
 n:=x+y; //i "ваще" нет хинт от компилятора и оптимизатор выкинет из конечного скомпилированного кода...
end;


 
Dimaxx ©   (2008-03-14 15:14) [10]


> Ты вообще понял о чём Семеныч писал? Или так а бы ляпнуть чего?

Я-то как раз понял о чем он, ибо часто сталкивался. А вот ты вроде не понял о чем я сказал.


> var i: Integer
> begin
>  i:=0;  //ни к чему hint от компилятора
>  I:=x+y;

В этом случае да, ибо присвоение 0 и тут же новое присвоение. А если

var i,x,y: integer
begin
 ...
 x:=4;
 ...
 y:=5;
 ...
 ...
 i:=x+y;
 ...
end;

орет, что i не инициализировано - ставишь i:=0 в начале и все отлично. Однажды даже столкнулся с такой тупостью, что переменная (не инициализированная) использовалась как временная для хранения промежуточного результата, далее выполнялись некие действия, а потом этот промежуточный рез-т заносился в поле record"а. И компилятор вякнул, что переменная объявлена, но нигде не используется... Видел такое только 1 раз - больше не попадалось. Даже не понял с какого перепугу он переменная не понравилась компилятору...


 
Плохиш ©   (2008-03-14 15:16) [11]


> var i,x,y: integer
> begin
>  ...
>  x:=4;
>  ...
>  y:=5;
>  ...
>  ...
>  i:=x+y;
>  ...
> end;
>
> орет, что i не инициализировано - ставишь i:=0 в начале
> и все отлично.

А свои многоточия проверить западло конечно, всё компилятор виноват...


 
Dimaxx ©   (2008-03-14 15:21) [12]

В многоточиях не упоминается ни x, ни y, ни i. Поэтому они тут не причем. Мне непонятен один момент: зачем орать, что переменная не инициализирована, если i:=x+y и так инициализация с присвоением результата (по большому счету мне по барабану значение, которое хранится в i до инициализации). Ну подумаешь она не в самом начале процедуры.


 
Johnmen ©   (2008-03-14 15:28) [13]


> Dimaxx ©   (14.03.08 15:14) [10]
> Dimaxx ©   (14.03.08 15:21) [12]

Ты, наверное, и if"ы замноготочил?
А потом удивляешься...:)

PS
Для полного успокоения напиши
var i,x,y: integer
begin
x:=4;
y:=5;
i:=x+y;
if i=0 then;
end;

потом расскажи :)


 
Dimaxx ©   (2008-03-14 15:44) [14]


> Ты, наверное, и if"ы замноготочил?
> А потом удивляешься...:)

Я уже говорил, что


> В многоточиях не упоминается ни x, ни y, ни i. Поэтому они тут не причем.


 
Johnmen ©   (2008-03-14 15:58) [15]


> Dimaxx ©   (14.03.08 15:44) [14]

Какая логическая(или другая) связь между
> if"ы замноготочил?
и
>В многоточиях не упоминается ни x, ни y, ни i.
?


 
Dimaxx ©   (2008-03-14 16:22) [16]

Связь в том, что в пропущенных командах не употребляются указанные переменные и тем более нет if"ов с i, на отсутствие инициализации которой и ругается компилятор. Вроде я правильно понял вопрос. Если нет - растолкуй что ты имел в виду. :)


 
clickmaker ©   (2008-03-14 16:28) [17]


>  [16] Dimaxx ©   (14.03.08 16:22)

в таком коде
x:=4;
y:=5;
i:=x+y;

максимум, что робко шепнет компилятор, это "value assigned to x(y,i) never used"
так что, не надо тут ля-ля


 
Johnmen ©   (2008-03-14 16:29) [18]


> Dimaxx ©   (14.03.08 16:22) [16]

Я уже сам забыл, что имел в виду :)
Ты просто попробуй [13] и прокомментируй результат...


 
Dimaxx ©   (2008-03-14 16:32) [19]


> x:=4;
> y:=5;
> i:=x+y;

Именно в таком - ессно.


 
clickmaker ©   (2008-03-14 16:35) [20]


> [19] Dimaxx ©   (14.03.08 16:32)

а в [10] разве не такой вид?


 
Семеныч   (2008-03-14 16:51) [21]

> Dimaxx ©   (14.03.08 16:22) [16]

> в пропущенных командах не употребляются указанные переменные и тем
> более нет if"ов с i, на отсутствие инициализации которой и ругается
> компилятор.

А это и не обязательно. Связь может быть и не такой явной. Например:

var
 i: integer;
begin
 try
   i := MyFunction(...);
 except
   on E: Exception do
     ShowMessage(IntToStr(i)); // Здесь компилятор ругнется.
 end;
end;


 
Anatoly Podgoretsky ©   (2008-03-14 16:54) [22]


> орет, что i не инициализировано - ставишь i:=0 в начале
> и все отлично

Лапшу на уши не вешай.


 
Семеныч   (2008-03-14 17:00) [23]

> Dimaxx ©   (14.03.08 16:22) [16]

Обратите внимание, что переменная, вроде бы, железно инициализируется - а оказывается, что нет. То же самое (или что-то типа этого) может быть и в Вашем примере [10], смотря что написано в многоточиях. Например:

var
  i, x, y: integer
begin
 try
   ...
   if (x = 0) or (y = 0) then
     raise ...;
   i := x + y;
 finally
   ... // Здесь переменная i может быть неинициализирована.
 end;
end;


 
Anatoly Podgoretsky ©   (2008-03-14 17:11) [24]

Если будет использоваться в finally, то конечно может быть неинициализирована.


 
Dimaxx ©   (2008-03-14 17:58) [25]


> Лапшу на уши не вешай.

Сначала попробуй - потом заявляй. :)

Народ, что в коде идет работа по выводу данных в listview (простой вывод в цикле). i - переменная для временного хранения промежуточных данных (которые более нигде не используются - только внутри цикла). Кроме суммы и последующей записи результата ничего с переменной не делается. Так вот именно отсутствие i:=0 в начале процедуры и не нравится компилятору. Но код рабочий и с i:=0 и без него. Никаких if"ов в коде нет вообще. Поэтому мне и непонятно - что именно не понравилось компилятору в неинициализированной переменной. Код процедуры дословно я уже не помню - было где-то год назад.

Если вам нравится придираться к словам - удачи...


 
Dimaxx ©   (2008-03-14 18:01) [26]


> а в [10] разве не такой вид?

За многоточием может скрываться десяток строк кода. В [17] у тебя просто три строки - в таком виде ессно данного варнинга не увидишь. :)


 
{RASkov} ©   (2008-03-14 18:08) [27]

> Dimaxx ©

Вот и я в твоем присутствии чувствую себя таким умным :)
Зачем спорить в том, что самому кажется глупым?


 
clickmaker ©   (2008-03-14 18:12) [28]


> [26] Dimaxx ©   (14.03.08 18:01)

ну так тебе Семеныч тут уже привел примеры, что там может скрываться для получения варнинга.


 
Anatoly Podgoretsky ©   (2008-03-14 18:54) [29]

> Dimaxx  (14.03.2008 18:01:26)  [26]

В таком виде не скомпилируется, надо или убрать многоточия или замаскировать это, за тебя это уже сделали и доказали, что ты вешаешь лапшу на уши, все работает, а вот у тебя наверняка другая лапша, в которой ошибки.


 
Dimaxx ©   (2008-03-14 19:56) [30]


> Зачем спорить в том, что самому кажется глупым?

Так вот именно эта глупость и непонятна! Ладно если бы спрашивал непонимая где сам накосячил и доказывал бы свою правоту. Я как раз и хочу понять - почему иногда компилятор выдает такую чушь.


> все работает

Ну ты даешь! А я что - доказывал, что не работает? Именно что работает! Но почему компилятору не нравится так, а так (практически тоже самое, но с обнулением переменной до использования) сойдет - непонятно. Читай плз внимательнее.


> другая лапша, в которой ошибки

Какая другая? В простом заполнении listview данными из record"а без намека на целочисленную переменную (кроме переменной цикла)? Не смеши... :)


> что там может скрываться для получения варнинга

Я это все видел и знаю об этом. Я спросил о том, что непонятно: зачем компилятор предупреждает об отсутствии инициализации переменной, если оптимизатор все равно этот код инициализации (i:=0) выкинет? Логики 0! Вполне возможно это "подарки" Д5 (именно на ней сижу). В более поздних версиях этого может и не быть.


 
{RASkov} ©   (2008-03-14 20:27) [31]

> [30] Dimaxx ©   (14.03.08 19:56)

А ты приведи код один в один, где ты в чем-то сомневаешься, тогда и поговорить нормально можно будет, иначе ты кажешься дураком, который доказывает сам не знает что... ;) не прими за наезд...


 
Dimaxx ©   (2008-03-14 21:15) [32]

Да нет уже этого кода - ессно бы привел...


 
{RASkov} ©   (2008-03-14 21:17) [33]

> [32] Dimaxx ©   (14.03.08 21:15)

Значит, давай договоримся, что ты что-то путаешь, ок? ;)


 
Dimaxx ©   (2008-03-14 21:31) [34]

Не путаю. Вот нашел пример (KOL). Tree заполнен данными в другой процедуре. Далее они динамически заполняются.

var Tree: PTree;

procedure TForm1.Button1Click(Sender: PObj);
var I,J,N: integer;
begin
 TreeView1.BeginUpdate;
 TreeView1.Clear;
 J:=TreeView1.TVInsert(0,0,"Root");
 N:=0;
 for I:=0 to pred(Tree.Count) do
   begin
     N:=TreeView1.TVInsert(J,N,Format("%s (%d)",[Tree.Items[I].Name,Tree.Items[I].Tag]));
     if Tree.Items[I].Count>0 then SetTree(Tree.Items[I],N);
   end;
 TreeView1.EndUpdate;
end;


Если так компилировать - все ОК, но стоит закомментировать N:=0 как компилятор ругается на неинициализированную переменную. Какая ему разница, если в цикле переменной присваивается конкретное значение? Код рабочий в обоих вариантах.


 
{RASkov} ©   (2008-03-14 21:37) [35]

> [34] Dimaxx ©   (14.03.08 21:31)

А теперь внимательно глянь на эту строку

> N:=TreeView1.TVInsert(J,N,Format("%s (%d)",[Tree.Items[I].Name, Tree.Items[I].Tag]));

как ты думаешь чему здесь должно быть ровно выделенная N???!!! это если с закоментированной строкой //N:=0;


 
Dimaxx ©   (2008-03-14 21:41) [36]

Тут да, пример неудачный. Не заметил сразу. Но факт есть факт - не любит компилятор неинициализированных переменных.


 
{RASkov} ©   (2008-03-14 21:41) [37]

> [34] Dimaxx ©   (14.03.08 21:31)

Ну и кто теперь дурак? Компилятор или.... ;)


 
{RASkov} ©   (2008-03-14 21:42) [38]

> [36] Dimaxx ©   (14.03.08 21:41)

Мыло мачало... :(
:о)


 
{RASkov} ©   (2008-03-14 21:44) [39]

> [36] Dimaxx ©   (14.03.08 21:41)
> Но факт есть факт - не любит компилятор неинициализированных
> переменных.

Вообщето вы здесь с компилятором - правы, но ты споришь выше не об этом :)


 
Anatoly Podgoretsky ©   (2008-03-14 21:48) [40]

> Dimaxx  (14.03.2008 21:31:34)  [34]

Это где же инициализировано

N:=TreeView1.TVInsert(J,N - это что?



Страницы: 1 2 3 вся ветка

Текущий архив: 2008.04.13;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.018 c
3-1195553109
Девушка
2007-11-20 13:05
2008.04.13
доступ к blob в dbf


2-1205943484
oletta
2008-03-19 19:18
2008.04.13
корень третьей степени


2-1205652230
NewSer
2008-03-16 10:23
2008.04.13
В чём причина появления ошибки: «parameter Kod not found»?(ADO)


2-1205818220
Stepper
2008-03-18 08:30
2008.04.13
Как из String выбрать данные определенного формата?


15-1204096084
Виталий
2008-02-27 10:08
2008.04.13
Настроить файервол для фильтрации транзитного трафика LINUX