Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Value assigned to


Страницы:   1 2 3 4

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. Простое присваивание без последующего использования переменной автоматически отметается компилятором ПРИ ВКЛЮЧЕННОЙ ОПТИМИЗАЦИИ (см. св-ва проекта).




Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо