![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с указателями [D7]
aka © (2012-12-28 11:35:00)Привет, чтобы лучше донести суть вопроса набросал примерчик
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
PA = ^TA;
TA = record
recType: string[20];
field_1: Integer;
field_2: Integer;
end;
PB = ^TB;
TB = record
recType: string[20];
field_3: Integer;
field_4: Integer;
name: String[30];
end;
PC = ^TC;
TC = record
recType: string[20];
field_5: Integer;
end;
var
PtrData: array of Pointer;
PtrCount: Integer;
A: PA;
B: PB;
C: PC;
i: Integer;
begin
PtrCount := 3;
SetLength(PtrData, PtrCount);
New(A); //index in PtrData array = 0
A.recType := 'AType';
A.field_1 := 1;
A.field_2 := 2;
PtrData[0] := A;
New(B); //index in PtrData array = 1
B.recType := 'BType';
B.field_3 := 1;
B.field_4 := 2;
B.name := 'ivan';
PtrData[1] := B;
New(C); //index in PtrData array = 2
C.recType := 'CType';
C.field_5 := 1;
PtrData[2] := C;
writeln(PA(PtrData[0])^.recType); //out = AType
writeln(PB(PtrData[1])^.recType); //out = BType
writeln(PC(PtrData[2])^.recType); //out = CType
for i := 0 to Length(PtrData) - 1 do
writeln(i,' - ',PA(PtrData[i])^.recType);
for i := 0 to Length(PtrData) - 1 do
Dispose(PtrData[i]);
readln;
end.
Теперь, если мне нужно вывести значения, я могу поступить так:
writeln(PA(PtrData[0])^.recType); //out = AType
writeln(PB(PtrData[1])^.recType); //out = BType
writeln(PC(PtrData[2])^.recType); //out = CType
Здесь мы явно "показываем" тип PA или PB или PC перед PtrData[I], потому что знаем что там "лежит". Вопрос: как быть если мы не знаем что там, но нам нужно узнать какой там находится тип записи (у каждой и трех структур {A,B,C} имеется общее поле recType).
Можно и так, но бутет ли так корректно, применил один из типов, хотя там может быть и другой:
for i := 0 to Length(PtrData) - 1 do
writeln(i,' - ', PA(PtrData[i])^.recType);
Сергей М. (2012-12-28 12:11:00) [21]
> А может пойдет?
>
Ну в качестве самодельного велосипеда вполне подойдет.
Только непонятно зачем в поле recType держать именно строку, в то время как достаточно одного байта.
Сергей М. (2012-12-28 12:07:00) [22]
> нужны же именно записи
Дельфийские классы и объекты и есть ничто иное как записи.
aka (2012-12-28 12:06:00) [23]пардон.
for i := 0 to Length(PtrData) - 1 do
begin
if(PA(PtrData[i])^.recType = 'AType') then
writeln(PA(PtrData[i])^.field_2);
if(PA(PtrData[i])^.recType = 'BType') then
writeln(PB(PtrData[i])^.name);
if(PA(PtrData[i])^.recType = 'CType') then
writeln(PC(PtrData[i])^.field_5);
end;
aka (2012-12-28 12:04:00) [24]А может пойдет?
работает без ошибок, ну первый IF - понятное дело, но ведь нормально работает и в остальных случаях.
for i := 0 to Length(PtrData) - 1 do
begin
if(PA(PtrData[i])^.recType = 'BType') then
writeln(PA(PtrData[i])^.field_2);
if(PA(PtrData[i])^.recType = 'BType') then
writeln(PB(PtrData[i])^.name);
if(PA(PtrData[i])^.recType = 'CType') then
writeln(PC(PtrData[i])^.field_5);
end;
aka (2012-12-28 11:51:00) [25]
> используется в дельфийских классах и объектах
Ну так нужны же именно записи.
aka (2012-12-28 11:50:00) [26]
> Сергей М. © (28.12.12 11:44) [1]
Что не будет - догадывался.
RTTI - за это ничего не знаю, почитаю.
Сергей М. (2012-12-28 11:44:00) [27]
> бутет ли так корректно
Не будет.
Собственно а к чему этот велосипед, если он давно уже изобретен, называется RTTI (таблица информации о типах времени выполнения) и сплошь и рядом используется в дельфийских классахи объектах