Форум: "Основная";
Текущий архив: 2002.04.01;
Скачать: [xml.tar.bz2];
ВнизValue assigned to Найти похожие ветки
← →
Gluka (2002-03-14 02:18) [0]Что это за фигня, и как с этим бороться!!!
← →
Lego (2002-03-14 02:26) [1]Ты где-то в
var
объявил об этой A и она просто неиспользуетса... либо если и используетса то не так как ожидал этого твой Делфи
← →
~Sergius (2002-03-14 02:57) [2]Ко второй части вопроса ("как с этим бороться") -- выключается опция показывать Warnings
← →
Suntechnic (2002-03-14 03:20) [3]>~Sergius (14.03.02 02:57)
>выключается опция показывать Warnings
Обычно это устраняется путём удаления "лишней" переменной, но кто во что горазд конечно...
← →
~Sergius (2002-03-14 04:06) [4]2 Suntechnic ©
В который раз меня подводит привычка не ставить смайлы после шутки
← →
Suntechnic (2002-03-14 04:14) [5]>~Sergius (14.03.02 04:06)
:)
← →
Gluka (2002-03-14 04:21) [6]program g1;
uses ??;
var
a: integer;
begin
a:=0;
...
...
Value assigned to "A" never used
Почему!?!?!?
← →
Suntechnic (2002-03-14 04:32) [7]>Gluka © (14.03.02 04:21)
А ты покажи место, где у тебя переменнаяa
используется? Если такового нет, то что ты тогда от компилятора хочешь?
← →
Lego (2002-03-14 06:41) [8]У тебя переменная
1. объявлена.
2. приравнена 0.
3. но не используется :)
← →
stub (2002-03-14 07:39) [9]get focus on your messages window (where compiler collects its messages) and press F1 on selected error. you"ll get description on error from borland help.
enjoy.
← →
Song (2002-03-14 08:32) [10]Кстати компилятор иногда ошибается насчёт подобного сообщения.
Хотел сначала привести пример такой ошибки, но думаю он (пример в смысле) строчек на 30, думаю не интересно будет его рассматривать другим. Компилятор легко вывести из толку.
← →
drpass (2002-03-14 10:19) [11]>Gluka
А что тебя напрягает? Это ведь не ошибка, а предупреждение. Компилятор видит совершенно бесполезное присваивание (потому что ты действительно не используешь присвоенное значение), и считает своим долгом предупредить тебя - вдруг ты забыл дописать какую-нибудь команду. Если же тебе не нравятся такие предупреждения, ты можешь их отключить на вкладке Project Options->Compiler
← →
Anatoly Podgoretsky (2002-03-14 22:53) [12]Лучше всего пирслушать к компилятору и использовать, а иначе зачем оно тебе нужно?
Song © (14.03.02 08:32)
А ты давай приведи, вдруг компилятор прав.
← →
Malder (2002-03-14 23:12) [13]Anatoly Podgoretsky, компилятор действительно ошибается. И действительно трудно привести пример. У меня это было с каким-то компонентом. Он всегда писал S1 not used. Хотя S1 еще как юзалась...
← →
Anatoly Podgoretsky (2002-03-14 23:25) [14]Не ну так головословно, обычно есть логика в действиях компилятора или ты его запутал :-)
← →
Shirson (2002-03-15 07:54) [15]Компилятор прав.
a:=0; это не использование переменной. Использование переменной это c:=b+a; Или for a:=0 to 100 do...
Попробуй выкинуть из свой процедуры декларацию этой переменной, убери из тела a:=0 и запусти программу. Что-нибудь неработает? :)
← →
Внук (2002-03-15 09:27) [16]А мне бы тоже хотелось увидеть пример кода. Компилятор действительно иногда выводит "лишние" предупреждения, но не этого типа (насчет неинициализированной переменной бывает). Предупреждение на использование переменной достаточно легко проверить - компилятор всего лишь ищет обращения к данному участку памяти на чтение - оно либо есть, либо нет. По крайней мере, в моей практике (и моих коллег) случая ошибочного вывода именно этого предупреждения не было.
← →
Sergey13 (2002-03-15 09:52) [17]У меня тоже так бывало. Ругалось на неиспользование, при явном использовании переменной. Но как то эпизодически (то есть, то нет, и не каждый день) и "лечилось" повторной компиляцией. Вот так просто. Скомпилил раз - получил, скомпилил второй - пропало. Может с первого раза не понимал 8-) А отключать варнинги не стОит - иногда дело говорит.
← →
Shirson (2002-03-15 10:10) [18]>Внук © (15.03.02 09:27)
А мне бы тоже хотелось увидеть пример кода. Компилятор действительно иногда выводит "лишние" предупреждения, но не этого типа (насчет неинициализированной переменной бывает).
---
Есть такое. Это когда объявляешь переменную и используешь её значение без предварительной инициализации. Что называется на свой страх и риск - компилятор за последствия ответственности не несет ;)
← →
MAxiMum (2002-03-15 10:16) [19]Беда-то ещё в том, что компилятор ещё и выкинет строки кода с неиспользованной переменной (посмотрите на левую часть редактора с точками).
КОДА! КОДА! КОДА! КОДА! КОДА! КОДА! КОДА! КОДА! КОДА! КОДА! КОДА!
← →
Sergey13 (2002-03-15 10:52) [20]Опять полез в Делфу и получилось
procedure TForm12.FormShow(Sender: TObject);
var i,k,ls, vch,vcho:integer;
....
бла-бла-бла
....
vch:=1;
vcho:=1;
for i:=1 to ls do
begin
c:=copy(s,i,1);
if pos(c,"0123456789.,")>0 then st:=st+c
else
begin
if c="(" then vch:=1 else
if c="*" then vch:=2 else
if c="/" then vch:=3 else vch:=0;
if vch=1 then k:=k+1;
.....
бла-бла-бла
.....
Выдало - Value assigned to "vch" never used
При повторной компиляции исчезло.
← →
Внук (2002-03-15 10:53) [21]>>Shirson ©
Я имел в виду немного другое, то есть действительно "лишние" предупреждения. Например, условный оператор, где переменная инициализируется только в одной ветке, а выполнению другой ветки невозможно по логике программы (пока недописанной). Вот так:
...
var i:byte;
...
procedure First;
begin
i:=1;
...
end;
procedure Second;
var ААА:integer;
begin
if i=1 then
begin
AAA:=1;
...
end
else
begin
...
end;
ShowMessage(IntToStr(AAA));
end;
Код набирал прямо здесь, но, думаю, смысл понятен
← →
Внук (2002-03-15 11:00) [22]>>Sergey13 ©
Так ведь и правильно. Присвоение vch:=1; в самом начале бессмысленно, так как потом эта переменная в ЛЮБОМ случае переприсваивается.
"При повторной компиляции исчезло." :)) А если сделать Build All - появится снова.
← →
Внук (2002-03-15 11:09) [23]Да, к коду в сообщении Внук © (15.03.02 10:53) нужно добавить что-то вроде
procedure Form1.OnCreate ...
begin
First;
Second;
end;
← →
Sergey13 (2002-03-15 11:17) [24]>Внук © (15.03.02 11:00)
Да ты прав, спасибо. Что то я это дело прошляпил, и покатил бочку на Делфу. Каюсь.
← →
Anatoly Podgoretsky (2002-03-15 21:47) [25]Sergey13 © (15.03.02 10:52)
Говорили же прислушайся к компилятору, первое значение не используется НИКОГДА
Внук © (15.03.02 10:53)
Ну тут две проблемы.
1. компилятор одно проходный, он не может знать что переменная модет быть использован в другой процедуре, а может быть и нет, например по рпичине исключения.
2. переменная ААА может быть неинициализирована.
То есть оба примера неудовлетворительные.
← →
Song (2002-03-16 11:09) [26]2Anatoly Podgoretsky © (14.03.02 22:53)
Извиняюсь, что раньше не смог, только приехал.
Пожалуйста, выдаёт что переменная Flag никогда не используется:
Flag:=False;
With Strg Do
With TreeView.Items Do
For t:=1 to RowCount-1 Do
Begin
Node:=TreeView.Items[0];
Repeat
try
IF Pos(Cells[IndexNo,t],Node.Text)>0 then
IF Pos("ingoing",S)>0 then
Begin
.....
Flag:=True;
End Else
Begin
......
Flag:=True;
End;
IF Node.Text="Другие документы" then NodeSafe:=Node;
Node:=Node.GetNextSibling;
except
IF not Flag then
Begin
.....
Flag:=True;
End;
Break;
end;
Until False;
End;
← →
Внук (2002-03-18 17:20) [27]>>Song ©
А Вы считаете, что используется? Если код действительно таков, как здесь, можете смело выкидывать эту переменную Flag. Выход из цикла возможен только по Exception, где Flag будет всегда true. В теле цикла значение Flag не используется. Или я чего-то не понял?
← →
Внук (2002-03-18 17:55) [28]>>Song ©
Торможу, однако. Нельзя Flag выкидывать, от него зависит обработка Exception. Только вот хотите верьте, хотите - нет, но этот код у меня (Delphi5) не выдал на переменную Flag никаких предупреждений. Может быть, дело в том, что стоит вместо ... ?
← →
Song (2002-03-19 08:59) [29]2Внук © (18.03.02 17:55)
А у меня выводит :(( Я ж говорю, компилятор запутался...
Нет, вместо ... там ничего такого нет.
Кстати отрывок выкусил из программы некорректно.
Строка Flag:=False; стоит перед Repeat, т.е.:
.....
For t:=1 to RowCount-1 Do
Begin
Node:=TreeView.Items[0];
Flag:=False;
Repeat
try
IF Pos(Cells[Ind
...
Но это ничего не меняет. Предупреждение по прежнему не должно выдаваться.
← →
ao1973 (2002-03-19 09:49) [30]Удалено модератором
← →
Song (2002-03-19 09:55) [31]2ao1973 (19.03.02 09:49)
Какой у Вас вопрос? Почему сразу в обидки?
← →
keg (2002-03-19 10:16) [32]в показаном примере компилятор правильно предупреждает. В первой строке ты присваиваешь ему False и далее (в пропущенной строке) опять делаешь присваивание, а между ними Flag не используется, значит первое присваивание не нужно - его можно вырезать. Ну и в самом конце, в Exception опять делаешь присваивание, а после (до конца процедуры) Flag не используется, стало быть - какая разница, какое значение будет иметь Flag после выхода из цикла?
← →
Rooman (2002-03-19 10:36) [33]Так, господа программисты!
Разрешаю вашу проблему раз и навсегда!
1.Компилятор компилит проект с ОПТИМИЗАЦИЕЙ кода (т.е. ваш код он преобразует оптимально - смотрите ДИЗАССЕМБЛЕР вашего кода), если включена опция ОПТИМИЗАЦИИ кода (см. свойства проекта).
Что это значит? Это значит, что под некоторые ЛОКАЛЬНЫЕ переменные место в ПАМЯТИ не резервируется, т.е. код оптимизируется так, что все операции по ЭТОЙ ПЕРЕМЕННОЙ происходят внутри РЕГИСТРОВ ПРОЦЕССОРА. Пример:
var a,b:integer;
...
a:=1;
b:=a;
...
компилится так:
mov eax,1 ; eax - регистр процессора
mov b,eax
...
и компилятор выдает предупреждение "Переменная a никогда не используется".
По большому счету - это даже хорошо, т.к. работает максимально БЫСТРО (без обращения к памяти).
2. Простое присваивание без последующего использования переменной автоматически отметается компилятором ПРИ ВКЛЮЧЕННОЙ ОПТИМИЗАЦИИ (см. св-ва проекта).
← →
Ray (2002-03-19 10:46) [34]2 Rooman. Все верное. Все приведенные выше кода страдают одной и тоже ошибкой, вернее не ошибкой а недопониманием или не внимательностью. идет присвоение к переменной в первый раз, и далее сколько бы кода небыло если из нее ничего не считывается и только присваивается то первое присваивание совершенно ненужно. Вот компилятор и предупреждает. Легче всего понят это таким образом. Берем код. кдаляем строки где нет этой переменной и после чего смотри что остается?
Flag:=False;
Flag:=True;
← →
RedWood (2002-03-19 10:54) [35]Всем привет !
>Кстати отрывок выкусил из программы некорректно.
>Строка 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 все-равно переменная переопределяется. Естественно это справедливо, если переменная не используется дальше в процедуре.
кстати, предепреждение на какую строку дает ?
← →
keg (2002-03-19 11:17) [36]2 RedWood. щелкни два раза на предупреждении и тебе покажет нужную строку.
← →
Song (2002-03-19 11:32) [37]2RedWood:
Я ошибся при постинге сюда. Переменная Flag стоит перед Repeat и не стоит перед With.
Я понимаю сообщение так: "Переменная была объявлена, но не использовалась". Покажите мне любой путь внутри данного отрывка пусть даже с исключением, где бы строка, работающая с Flag не произошла.
← →
Drex (2002-03-19 12:35) [38]А как вам этот кусок? Тут тоже не используется
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;
← →
Внук (2002-03-19 13:35) [39]>>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
Все, что я пытаюсь здесь доказать - это то, что предупреждение именно данного типа НИКОГДА не выводится зря. Но зачастую его можно игнорировать :)))
← →
Внук (2002-03-19 13:55) [40]>>Drex (19.03.02 12:35)
То же самое. Если Вы сумеете объяснить компилятору, зачем Вам первая строка i:=0 (мне это обосновать не удалось), он больше никогда не будет выдавать Вам предупреждение :)
Страницы: 1 2 вся ветка
Форум: "Основная";
Текущий архив: 2002.04.01;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.007 c