![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Hint-ы и Warning-и [D5, Win95/98, WinXP]
GanibalLector © (2005-09-14 20:38:00)Имеем следующие структуры(упрощ.вид):
type
TClass1 = record
a1:Byte;
a2:Word;
end;
PClass1 = ^TClass1;
type
TClass2 = record
a1:Byte;
a2:Word;
end;
PClass2 = ^ TClass2;
Пускай также будет след.ф-ция :
function GetClass1(Value:PClass1):Byte;
begin
Value.a1:=$01;
Value.a2:=$0102;
Result:=0;
end;
с которой работаю следующим образом :
var a:PClass1;
begin
GetMem(a,SizeOf(TClass2));
GetClass1(a);
Memo1.Lines.Add(IntToHex(a.a1,2)+'_'+IntToHex(a.a2,4));
FreeMem(a);
end;
Так вот,таких ф-ций у меня много и они весьма однотипны.Все закончилось тем,что я начал путаться в собственном коде :(
Придумал следующее :
function GetValue(Mode:Byte;Value:Pointer):Byte;
var a:PClass1;
b:PClass2;
begin
case Mode of
0:begin
a.a1:=$ee; // Warning:Variable 'a' might not have been initialized
a.a2:=$eedd;
Value:=a; // Hint:Value assigned to 'Value' never used
end;
1:begin
b.a1:=$cc; // Warning:Variable 'b' might not have been initialized
b.a2:=$ff55;
Value:=b; // Hint:Value assigned to 'Value' never used
end;
end;
Result:=0;
end;
работаю так :
var a:PClass1;
b:PClass2;
I:Integer;
begin
I:=0; // Set 0 or 1
case I of
0:begin
GetMem(a,SizeOf(TClass1));
GetValue(I,a);
Memo1.Lines.Add(IntToHex(a.a1,2)+'_'+IntToHex(a.a2,4));
FreeMem(a);
end;
1:begin
GetMem(b,Sizeof(TClass2));
GetValue(I,b);
Memo1.Lines.Add(IntToHex(b.a1,2)+'_'+IntToHex(b.a2,4));
FreeMem(b);
end;
end;
end;
В результате получаю Hint-ы и Warning-и. Как побороть??? Да и вообще,правильный ли подход? Может можно еще короче сделать сабж?
DesWind (2005-09-14 22:12:00) [1]
> kami © (14.09.05 22:08) [14]
Ага, согласен.
kami (2005-09-14 22:08:00) [2]DesWind © (14.09.05 21:51) [12]
> если к примеру будет 2.
Неправда Ваша (с) :)
Предупреждение компилятор выдает потому, что a и b являются указателями,
и на момент обращения к их полям (for example, a.a1) под них не выделена память, что приведет к ошибке при обращении.
А если mode=2, то (в данном примере) не будет выполнено никаких действий, так что определены переменные или нет - не будет иметь совершенно никакого значения.
DesWind (2005-09-14 21:58:00) [3]и еще один бесплатный совет, если много однотипного надо обобщать.
Я повнимательнее в код вчитался - извини, но бред какой-то.
DesWind (2005-09-14 21:51:00) [4]
> GanibalLector © (14.09.05 21:02) [4]
В этом и есть как мне кажется твоя основная проблема. Надо конкретно ставить задачу. А так телепатировать особо не хочется.
> kami © (14.09.05 21:07) [7]
Теперь крышки можно не ставить компилятор и так понимает.
А это преддупреждение возникает, так как действительно переменная может быть не определена, если к примеру будет 2.
kami (2005-09-14 21:26:00) [5]Даже и не знаю...
Может, действительно стоит подумать насчет собственного класса ?
Сделать общего предка с абстрактным методом типа GetValue(и другими необходимыми), а в наследниках - перекрывать его собственными, со своими вычислениями в каждом ?
Если нет такой возможности или желания, кажется, непомешало бы пересмотреть саму GetValue - может, можно ее как-то структурировать, разбить на подзадачи ? Потому что 2 листа -), действительно можно запутаться.
GanibalLector (2005-09-14 21:12:00) [6]2 kami © (14.09.05 21:07) [7]
Спасибо,помогло.
Ну,а на счет подхода???
GanibalLector (2005-09-14 21:08:00) [7]2 OldNaum (14.09.05 21:04) [6]
Хорош трепаться.Для этого соответствующие ветки форума есть.
2 OldNaum © (14.09.05 21:02) [5]
А что еще рисовать??? ИМХО в [0] и так все "разрисовано" дальше некуда.
kami (2005-09-14 21:08:00) [8]Упс ... Заменить :
1:begin
PClass1(Value)^.a1:=$cc;
PClass1(Value)^.a2:=$ff55;
на
1:begin
PClass2(Value)^.a1:=$cc;
PClass2(Value)^.a2:=$ff55;
kami (2005-09-14 21:07:00) [9]OldNaum © (14.09.05 20:54) [1]
>даже немного жутковатый
Даже не немного :)
По порядку :
> Warning:Variable 'a' might not have been initialized
Естественно, она только была объявлена в var ф-и, память под нее не выделена, правильно компилятор ругается.
можно так :
procedure GetValue(Mode:Byte;var Value:Pointer);
begin
case Mode of
0:begin
PClass1(Value)^.a1:=$ee;
PClass1(Value)^.a2:=$eedd;
end;
1:begin
PClass1(Value)^.a1:=$cc;
PClass1(Value)^.a2:=$ff55;
end;
end;
end;
OldNaum (2005-09-14 21:04:00) [10]GanibalLector © (14.09.05 21:02) [4]
на пару листов не надо =) просто обычно в таких ситуациях показывают, к примеру, строкой "..." что там еще кода та море ) я ж не телепат. прошу прощение, если чем обидел.
GanibalLector (2005-09-14 21:02:00) [11]>а смысл использовать functions и возвращать везде 0?
Ну,если хочешь я могу выдать полный код этой ф-ции.Эдак... на пару листов.
OldNaum (2005-09-14 21:02:00) [12]может обрисуешь в кратце задачу? вдруг мысля появится у кого.
DesWind (2005-09-14 21:01:00) [13]
> В результате получаю Hint-ы и Warning-и. Как побороть???
> Да и вообще,правильный ли подход? Может можно еще короче
> сделать сабж?
И првда, как-то корявенько выглядит...
DesWind (2005-09-14 20:59:00) [14]
> Так вот,таких ф-ций у меня много и они весьма однотипны.
> Все закончилось тем,что я начал путаться в собственном коде
> :(
Мож надо попробовать использовать TObject не record
OldNaum (2005-09-14 20:54:00) [15]а смысл использовать functions и возвращать везде 0? ну это так, к слову.
warnings я так понимаю из-за case (в одном случае A не инициализируется, в другом B), hints из-за того что value "реально" нигде не используется ))
подход, имхо, странный. даже немного жутковатый )