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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.009 c
1-163
Max
2002-03-22 08:32
2002.04.01
Delphi 5 + W2k


6-275
Satrap
2002-01-18 16:04
2002.04.01
Обработка искл. ситуаций в сокетах


1-99
Ivan_A
2002-03-21 03:11
2002.04.01
Как получить доступ к модулю данных из DLL?


3-79
Egor111
2002-03-04 21:35
2002.04.01
ADOConnection и иже с ним


3-12
Basile
2002-02-27 20:30
2002.04.01
Компоненты для доступа к MSSQL Server?