![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Value assigned to
Gluka © (2002-03-14 02:18:00)Что это за фигня, и как с этим бороться!!!
Rooman (2002-03-20 11:29:00) [21]Warnings - это не ошибки, если вы читали хотябы элементарный хелп к дельфе. Если бы это было ошибкой - хрен бы вам скомпилился, а не программа! В данном случае компилятор говорит, что память под переменную при компиляции не выделялась, т.е. нельзя поставить брейкпоинт на ее значение, например, или нельзя дебагером посмотреть ее значение на этапе выполнения. Вот и все! В чем проблемы то?
Rooman (2002-03-20 11:19:00) [22]Еще раз жирно: переменная не используется только тогда, когда под нее не выделена память в ОЗУ. Т.е. ее значение как минимумгуляет в регистрах. А это, как правило, всегда хорошо!
Внук (2002-03-20 10:00:00) [23]>>Анонимщик © (19.03.02 18:28)
Повторяю большими буквами: предупреждение означает не то, что ПЕРЕМЕННАЯ не используется, а то, что текущее ЗНАЧЕНИЕ ПЕРЕМЕННОЙ не используется. Почувствуйте же разницу и читайте сообщения буквально так, как они пишутся. Неправильный перевод приводит к неправильной интерпретации. Не решает компилятор, что переменная лишняя, он лишь сообщает, что значение, присвоенное переменной, сразу же (без какого-либо использования этого значения) затирается другим значением.
vl_chel (2002-03-20 08:24:00) [24]>>Drex в написанном вами коде переменные CardByte и i не мужны
i:=0; << Смысл??
CardByte:=0;
Repeat << к чему это относится?
Byte10:=0;
Bit:=0;
Repeat
i:=CardByte*8+Bit; << CardByte = 0 Смысл??
Case Bit Of {Перевод из двоичного в десятичное}
0:Byte10:=Byte10+Current[i]*128;<<Меняем во всех строчках I на Bit
1:Byte10:=Byte10+Current[i]*64;
2:Byte10:=Byte10+Current[i]*32;
3:Byte10:=Byte10+Current[i]*16;
4:Byte10:=Byte10+Current[i]*8;
5:Byte10:=Byte10+Current[i]*4;
6:Byte10:=Byte10+Current[i]*2;
7:Byte10:=Byte10+Current[i]*1;
End;
Bit:=Bit+1;
i:=i+1;<< зачем увеличивать I (грамотнееinc(I))
Until Bit=8;
vl_chel (2002-03-20 08:13:00) [25]По моему мнению вся эта дискусия состоит в том, что люди плохо или непонимающие программирование и работу программы злятся на компилятор за свои огрехи. Переменная не используется - сигнал о том что код плохой и требует доработки
Drex (2002-03-20 05:46:00) [26]>>Внук
И правда, пытался объянить, да только не получилось ничего, ;-) иногда такую ерунду напишешь, аж самому смешно становится. Это видать когда процедуру отлаживал некоторые ранее нужные вещи перестали быть нужными... Спасибо
Anatoly Podgoretsky (2002-03-19 20:46:00) [27]Что бы конкретно говорить, надо что бы предсталенный код можно было повторить, путем простого копированич в редактор, а оторваныые коды, к тому же с ошибками при коприовании мало чего дают, пока не приведен ни один пример, который можно было бы воспроизвести. Это говорит о том, что если компьютере и ошибается, то крайне редко. Но даже если он и ошибается, то есть смысл задуматься почему, может сделана неудачная конструкция, слишком сложная, что и компилятор не смог ее понять.
Анонимщик (2002-03-19 18:28:00) [28]Внук.
В коде они, может, и присутствуют, да компилятор их использовать не видит смысла, потому как они ни для чего не нужны. Каким образом именно этот компилятор решает, что именно эта переменная - лишняя и о ней можно не беспокоиться, судить не стану, для этого нужно его изнутри знать. Но кое-что предположить, конечно, можно. А присутствуют ли эти переменные в том, во что компилятор превратит ваш паскальный код (это, естественно, исполнимый код), это как раз и самое главное для понимания, откуда такие предупреждения берутся. Посмотри в отладчике на значение той переменной, на которую компилятор что-то плохое говорит, тогда и дело яснее станет.
Donal_Graeme (2002-03-19 16:38:00) [29]вот насчёт Internal Errors это отдельная история :-)) В хэлпе сказано, что такие ошибки никогда не должны появляться. Тем не менее они появляются :-) В некоторых случаях удаётся понять, что именно не понравилось компилятору (мне один раз удалось, но я не помню ни кода ошибки, ни причины).
deleon (2002-03-19 16:29:00) [30]Однажды у меня компилятор в одной абсолютно правильной функции объекта писал: "Internal Error xxxx" не помогала ни перезагрузка IDE, ни железа. В общем поменял местами эту функцию с соседней и все сразу компилятору понравилось! Но это было только один раз! Сколько раз я уже ругался на Delphi, но поковырявшись всегда оказывалось что это мои баги, так что можно сказать что в 99,8 % компилятор прав :)
Внук (2002-03-19 16:14:00) [31]>>Анонимщик © (19.03.02 15:44)
И зачем он это пишет? Для себя самого, или пообщаться хочет? Вопрос в том, когда появляются эти сообщения, и как их избежать. Тем более что во всех вышеперечисленных примерах переменные, на которые выданы предупреждения, в коде ПРИСУТСТВУЮТ в полный рост. А вот то, что большинство "крутых программистов" (никого из участников ветки в виду не имею и обидеть не хочу) не читают этих сообщений или не понимают их смысла - это факт.
Анонимщик (2002-03-19 15:44:00) [32]Чем вы занимаетесь? Компилятор компилирует и оптимизирует. Нет у него в конечном коде вашей переменной, вот и пишет. Ясно?
Внук (2002-03-19 13:55:00) [33]>>Drex (19.03.02 12:35)
То же самое. Если Вы сумеете объяснить компилятору, зачем Вам первая строка i:=0 (мне это обосновать не удалось), он больше никогда не будет выдавать Вам предупреждение :)
Внук (2002-03-19 13:35:00) [34]>>Song c (19.03.02 09:55) "Но это ничего не меняет. Предупреждение по прежнему не должно выдаваться."
Очень даже меняет :) Теперь и у меня выдает предупреждение на Flag:=True в приведенном ниже фрагменте:
...
Except
IF not Flag then
Begin
Flag:=True;
...
End;
Break;
end;
...
Ну и правильно, выход из цикла возможен только по Exception, при этом выполняется Flag:=True, а сразу же в следующей итерации внешнего цикла Flag:=False.
Собственно, на это и выдается предупреждение. Следует удалить из обработчика исключения присвоение флага. Компилятор прав.
Повторяю - данное предупреждение выдается, если между двумя обращениями к переменной на запись не было ни одного обращения к ней на чтение.
"Я понимаю сообщение так: "Переменная была объявлена, но не использовалась". - Сообщение понимать нужно так (буквально): переменной было присвоено значение, которое в дальнейшем не используется, то есть можно было его и не присваивать.
>>keg (19.03.02 10:16) См. Внук c (18.03.02 17:55) "Нельзя Flag выкидывать, от него зависит обработка Exception" - для старого фрагмента кода это так.
>>Ray c (19.03.02 10:46) Смею заметить, не все так просто. Хотя Rooman, конечно, прав.
>>All
Все, что я пытаюсь здесь доказать - это то, что предупреждение именно данного типа НИКОГДА не выводится зря. Но зачастую его можно игнорировать :)))
Drex (2002-03-19 12:35:00) [35]А как вам этот кусок? Тут тоже не используется
i:=0;
CardByte:=0;
Repeat
Byte10:=0;
Bit:=0;
Repeat
i:=CardByte*8+Bit;
Case Bit Of {Перевод из двоичного в десятичное}
0:Byte10:=Byte10+Current[i]*128;
1:Byte10:=Byte10+Current[i]*64;
2:Byte10:=Byte10+Current[i]*32;
3:Byte10:=Byte10+Current[i]*16;
4:Byte10:=Byte10+Current[i]*8;
5:Byte10:=Byte10+Current[i]*4;
6:Byte10:=Byte10+Current[i]*2;
7:Byte10:=Byte10+Current[i]*1;
End;
Bit:=Bit+1;
i:=i+1;
Until Bit=8;
Song (2002-03-19 11:32:00) [36]2RedWood:
Я ошибся при постинге сюда. Переменная Flag стоит перед Repeat и не стоит перед With.
Я понимаю сообщение так: "Переменная была объявлена, но не использовалась". Покажите мне любой путь внутри данного отрывка пусть даже с исключением, где бы строка, работающая с Flag не произошла.
keg (2002-03-19 11:17:00) [37]2 RedWood. щелкни два раза на предупреждении и тебе покажет нужную строку.
RedWood (2002-03-19 10:54:00) [38]Всем привет !
>Кстати отрывок выкусил из программы некорректно.
>Строка Flag:=False; стоит перед Repeat, т.е.:
.....
Flag:=False;
With Strg Do
With TreeView.Items Do
For t:=1 to RowCount-1 Do
Begin
Node:=TreeView.Items[0];
Flag:=False;
Repeat
получается что предупреждение дает на первое присваивание Flag:=False; т.к. в цикле FOR все-равно переменная переопределяется. Естественно это справедливо, если переменная не используется дальше в процедуре.
кстати, предепреждение на какую строку дает ?
Ray (2002-03-19 10:46:00) [39]2 Rooman. Все верное. Все приведенные выше кода страдают одной и тоже ошибкой, вернее не ошибкой а недопониманием или не внимательностью. идет присвоение к переменной в первый раз, и далее сколько бы кода небыло если из нее ничего не считывается и только присваивается то первое присваивание совершенно ненужно. Вот компилятор и предупреждает. Легче всего понят это таким образом. Берем код. кдаляем строки где нет этой переменной и после чего смотри что остается?
Flag:=False;
Flag:=True;
Rooman (2002-03-19 10:36:00) [40]Так, господа программисты!
Разрешаю вашу проблему раз и навсегда!
1.Компилятор компилит проект с ОПТИМИЗАЦИЕЙ кода (т.е. ваш код он преобразует оптимально - смотрите ДИЗАССЕМБЛЕР вашего кода), если включена опция ОПТИМИЗАЦИИ кода (см. свойства проекта).
Что это значит? Это значит, что под некоторые ЛОКАЛЬНЫЕ переменные место в ПАМЯТИ не резервируется, т.е. код оптимизируется так, что все операции по ЭТОЙ ПЕРЕМЕННОЙ происходят внутри РЕГИСТРОВ ПРОЦЕССОРА. Пример:
var a,b:integer;
...
a:=1;
b:=a;
...
компилится так:
mov eax,1 ; eax - регистр процессора
mov b,eax
...
и компилятор выдает предупреждение "Переменная a никогда не используется".
По большому счету - это даже хорошо, т.к. работает максимально БЫСТРО (без обращения к памяти).
2. Простое присваивание без последующего использования переменной автоматически отметается компилятором ПРИ ВКЛЮЧЕННОЙ ОПТИМИЗАЦИИ (см. св-ва проекта).