Форум: "Основная";
Текущий архив: 2005.10.09;
Скачать: [xml.tar.bz2];
ВнизHint-ы и Warning-и Найти похожие ветки
← →
GanibalLector © (2005-09-14 20:38) [0]Имеем следующие структуры(упрощ.вид):
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-и. Как побороть??? Да и вообще,правильный ли подход? Может можно еще короче сделать сабж?
← →
OldNaum © (2005-09-14 20:54) [1]а смысл использовать functions и возвращать везде 0? ну это так, к слову.
warnings я так понимаю из-за case (в одном случае A не инициализируется, в другом B), hints из-за того что value "реально" нигде не используется ))
подход, имхо, странный. даже немного жутковатый )
← →
DesWind © (2005-09-14 20:59) [2]
> Так вот,таких ф-ций у меня много и они весьма однотипны.
> Все закончилось тем,что я начал путаться в собственном коде
> :(
Мож надо попробовать использовать TObject не record
← →
DesWind © (2005-09-14 21:01) [3]
> В результате получаю Hint-ы и Warning-и. Как побороть???
> Да и вообще,правильный ли подход? Может можно еще короче
> сделать сабж?
И првда, как-то корявенько выглядит...
← →
GanibalLector © (2005-09-14 21:02) [4]>а смысл использовать functions и возвращать везде 0?
Ну,если хочешь я могу выдать полный код этой ф-ции.Эдак... на пару листов.
← →
OldNaum © (2005-09-14 21:02) [5]может обрисуешь в кратце задачу? вдруг мысля появится у кого.
← →
OldNaum © (2005-09-14 21:04) [6]GanibalLector © (14.09.05 21:02) [4]
на пару листов не надо =) просто обычно в таких ситуациях показывают, к примеру, строкой "..." что там еще кода та море ) я ж не телепат. прошу прощение, если чем обидел.
← →
kami © (2005-09-14 21:07) [7]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;
← →
GanibalLector © (2005-09-14 21:08) [8]2 OldNaum (14.09.05 21:04) [6]
Хорош трепаться.Для этого соответствующие ветки форума есть.
2 OldNaum © (14.09.05 21:02) [5]
А что еще рисовать??? ИМХО в [0] и так все "разрисовано" дальше некуда.
← →
kami © (2005-09-14 21:08) [9]Упс ... Заменить :
1:begin
PClass1(Value)^.a1:=$cc;
PClass1(Value)^.a2:=$ff55;
на1:begin
PClass2(Value)^.a1:=$cc;
PClass2(Value)^.a2:=$ff55;
← →
GanibalLector © (2005-09-14 21:12) [10]2 kami © (14.09.05 21:07) [7]
Спасибо,помогло.
Ну,а на счет подхода???
← →
kami © (2005-09-14 21:26) [11]Даже и не знаю...
Может, действительно стоит подумать насчет собственного класса ?
Сделать общего предка с абстрактным методом типа GetValue(и другими необходимыми), а в наследниках - перекрывать его собственными, со своими вычислениями в каждом ?
Если нет такой возможности или желания, кажется, непомешало бы пересмотреть саму GetValue - может, можно ее как-то структурировать, разбить на подзадачи ? Потому что 2 листа -), действительно можно запутаться.
← →
DesWind © (2005-09-14 21:51) [12]
> GanibalLector © (14.09.05 21:02) [4]
В этом и есть как мне кажется твоя основная проблема. Надо конкретно ставить задачу. А так телепатировать особо не хочется.
> kami © (14.09.05 21:07) [7]
Теперь крышки можно не ставить компилятор и так понимает.
А это преддупреждение возникает, так как действительно переменная может быть не определена, если к примеру будет 2.
← →
DesWind © (2005-09-14 21:58) [13]и еще один бесплатный совет, если много однотипного надо обобщать.
Я повнимательнее в код вчитался - извини, но бред какой-то.
← →
kami © (2005-09-14 22:08) [14]DesWind © (14.09.05 21:51) [12]
> если к примеру будет 2.
Неправда Ваша (с) :)
Предупреждение компилятор выдает потому, что a и b являются указателями,
и на момент обращения к их полям (for example, a.a1) под них не выделена память, что приведет к ошибке при обращении.
А если mode=2, то (в данном примере) не будет выполнено никаких действий, так что определены переменные или нет - не будет иметь совершенно никакого значения.
← →
DesWind © (2005-09-14 22:12) [15]
> kami © (14.09.05 22:08) [14]
Ага, согласен.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.10.09;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.014 c