Текущий архив: 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.56 MB
Время: 0.008 c