![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Value assigned to
Gluka © (2002-03-14 02:18:00)Что это за фигня, и как с этим бороться!!!
keg (2002-03-19 10:16:00) [41]в показаном примере компилятор правильно предупреждает. В первой строке ты присваиваешь ему False и далее (в пропущенной строке) опять делаешь присваивание, а между ними Flag не используется, значит первое присваивание не нужно - его можно вырезать. Ну и в самом конце, в Exception опять делаешь присваивание, а после (до конца процедуры) Flag не используется, стало быть - какая разница, какое значение будет иметь Flag после выхода из цикла?
Song (2002-03-19 09:55:00) [42]2ao1973 (19.03.02 09:49)
Какой у Вас вопрос? Почему сразу в обидки?
ao1973 (2002-03-19 09:49:00) [43]Удалено модератором
Song (2002-03-19 08:59:00) [44]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
...
Но это ничего не меняет. Предупреждение по прежнему не должно выдаваться.
Внук (2002-03-18 17:55:00) [45]>>Song ©
Торможу, однако. Нельзя Flag выкидывать, от него зависит обработка Exception. Только вот хотите верьте, хотите - нет, но этот код у меня (Delphi5) не выдал на переменную Flag никаких предупреждений. Может быть, дело в том, что стоит вместо ... ?
Внук (2002-03-18 17:20:00) [46]>>Song ©
А Вы считаете, что используется? Если код действительно таков, как здесь, можете смело выкидывать эту переменную Flag. Выход из цикла возможен только по Exception, где Flag будет всегда true. В теле цикла значение Flag не используется. Или я чего-то не понял?
Song (2002-03-16 11:09:00) [47]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;
Anatoly Podgoretsky (2002-03-15 21:47:00) [48]Sergey13 © (15.03.02 10:52)
Говорили же прислушайся к компилятору, первое значение не используется НИКОГДА
Внук © (15.03.02 10:53)
Ну тут две проблемы.
1. компилятор одно проходный, он не может знать что переменная модет быть использован в другой процедуре, а может быть и нет, например по рпичине исключения.
2. переменная ААА может быть неинициализирована.
То есть оба примера неудовлетворительные.
Sergey13 (2002-03-15 11:17:00) [49]>Внук © (15.03.02 11:00)
Да ты прав, спасибо. Что то я это дело прошляпил, и покатил бочку на Делфу. Каюсь.
Внук (2002-03-15 11:09:00) [50]Да, к коду в сообщении Внук © (15.03.02 10:53) нужно добавить что-то вроде
procedure Form1.OnCreate ...
begin
First;
Second;
end;
Внук (2002-03-15 11:00:00) [51]>>Sergey13 ©
Так ведь и правильно. Присвоение vch:=1; в самом начале бессмысленно, так как потом эта переменная в ЛЮБОМ случае переприсваивается.
"При повторной компиляции исчезло." :)) А если сделать Build All - появится снова.
Внук (2002-03-15 10:53:00) [52]>>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;
Код набирал прямо здесь, но, думаю, смысл понятен
Sergey13 (2002-03-15 10:52:00) [53]Опять полез в Делфу и получилось
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
При повторной компиляции исчезло.
MAxiMum (2002-03-15 10:16:00) [54]Беда-то ещё в том, что компилятор ещё и выкинет строки кода с неиспользованной переменной (посмотрите на левую часть редактора с точками).
КОДА! КОДА! КОДА! КОДА! КОДА! КОДА! КОДА! КОДА! КОДА! КОДА! КОДА!
Shirson (2002-03-15 10:10:00) [55]>Внук © (15.03.02 09:27)
А мне бы тоже хотелось увидеть пример кода. Компилятор действительно иногда выводит "лишние" предупреждения, но не этого типа (насчет неинициализированной переменной бывает).
---
Есть такое. Это когда объявляешь переменную и используешь её значение без предварительной инициализации. Что называется на свой страх и риск - компилятор за последствия ответственности не несет ;)
Sergey13 (2002-03-15 09:52:00) [56]У меня тоже так бывало. Ругалось на неиспользование, при явном использовании переменной. Но как то эпизодически (то есть, то нет, и не каждый день) и "лечилось" повторной компиляцией. Вот так просто. Скомпилил раз - получил, скомпилил второй - пропало. Может с первого раза не понимал 8-) А отключать варнинги не стОит - иногда дело говорит.
Внук (2002-03-15 09:27:00) [57]А мне бы тоже хотелось увидеть пример кода. Компилятор действительно иногда выводит "лишние" предупреждения, но не этого типа (насчет неинициализированной переменной бывает). Предупреждение на использование переменной достаточно легко проверить - компилятор всего лишь ищет обращения к данному участку памяти на чтение - оно либо есть, либо нет. По крайней мере, в моей практике (и моих коллег) случая ошибочного вывода именно этого предупреждения не было.
Shirson (2002-03-15 07:54:00) [58]Компилятор прав.
a:=0; это не использование переменной. Использование переменной это c:=b+a; Или for a:=0 to 100 do...
Попробуй выкинуть из свой процедуры декларацию этой переменной, убери из тела a:=0 и запусти программу. Что-нибудь неработает? :)
Anatoly Podgoretsky (2002-03-14 23:25:00) [59]Не ну так головословно, обычно есть логика в действиях компилятора или ты его запутал :-)
Malder (2002-03-14 23:12:00) [60]Anatoly Podgoretsky, компилятор действительно ошибается. И действительно трудно привести пример. У меня это было с каким-то компонентом. Он всегда писал S1 not used. Хотя S1 еще как юзалась...