Форум: "Основная";
Текущий архив: 2003.11.20;
Скачать: [xml.tar.bz2];
Вниздоступ к полю record а Найти похожие ветки
← →
rel_ (2003-11-10 14:45) [0]Мастера, есть переменная типа записи, например:
type
TR = record
a: string;
b: string;
end;
var r : TR;
Можно ли обратиться к r.a и к r.b не традиционным способом, нарпимер через базовый одрес переменной и смещение, зная, какой тип имеет каждое поле записи, например вроде: Ptr(r,SizeOf(String)).
Идея заключается в след. Есть массив рекордов, каждый из которых содержит немерено полей (знаю точно, что все они имеют тип String). Вот и хочется добираться до значений полей в цикле, а не обращаться к каждому отдельно, например (если такой синтаксис допустим):
var www : string
..........
for i:=0 to 100 do
www := (Ptr(r,i*SizeOf(String)))^
← →
panov (2003-11-10 15:05) [1]См. packed record
но смещение все равно нужно вычислять будет, так стоит ли овчинка выделки?
← →
McSimm2 (2003-11-10 15:14) [2]а как вичислить можно?
← →
PVitaliy (2003-11-10 15:47) [3]>>См. packed record
packed record тут не при чем
Такое сделать в принципе можно, см. код ниже
type
TR = record
a: string;
b: string;
c:string;
end;
var r : TR;
idx: Integer;
p:Pointer;
S: string;
begin
r.a:="3453";
r.b:="sdfsdtwert";
r.c:="bbbbbbbbbbbbbb";
p:=@r;
idx:=2; //индекс строчки, к которой надо добратся. Начинается с 0
p:=Pointer( Pointer(Cardinal(p)+sizeof(Pointer)*idx)^);
s:=PChar(p);
ShowMessage(s); //выведет bbbbbbbbbbbbbb
end;
Но лучше все же для таких целей использовать либо динамические массивы, либо TStrings.
← →
panov (2003-11-10 16:08) [4]>PVitaliy (10.11.03 15:47) [3]
А ты добавь вот такое поле и попробуй снова:
type
TR = record
s: String[10];
a: string;
b: string;
c:string;
end;
← →
McSimm2 (2003-11-10 16:30) [5]а если будет не string, а Extended - как сделать тогда ??
Вот так не работает
type
PR = ^TR;
TR = record
a, b, c: Extended;
end;
var
FR: PR;
FList: TList;
r: TR;
idx: Integer;
p: Pointer;
S: string;
begin
FList := TList.Create;
new(FR);
FR^.a := 3453.0;
FR^.b := 123.2;
FR^.c := 55.1;
FList.Add(FR);
p := @FList.Items[0]^;
idx := 2;
p := Pointer(Pointer(Cardinal(p) + sizeof(Pointer) * idx)^);
s := Extended(p^);
ShowMessage(FloatToStr(s));
← →
Sandman25 (2003-11-10 16:33) [6][5] McSimm2 (10.11.03 16:30)
sizeof(Pointer) -> sizeof(extended). Но без packed не обойтись уже.
← →
Романов Р.В. (2003-11-10 16:33) [7]Ё маё... Есть же массивы зачем огород городить...
← →
McSimm2 (2003-11-10 16:37) [8]Sandman25 © (10.11.03 16:33) [6]
на s := Extended(p^);
у меня валится ...
....
idx := 2;
p := Pointer(Pointer(Cardinal(p) + sizeof(extended) * idx)^);
s := extended(p^);
ShowMessage(floattostr(s));
....
← →
Sandman25 (2003-11-10 16:44) [9][8] McSimm2 (10.11.03 16:37)
А так?
type
pExtended = ^extended;
s := pExtended(p)^
← →
McSimm2 (2003-11-10 16:47) [10]Получилось сделать вот так:
type
PR = ^TR;
TR = packed record
a, b, c: Extended;
end;
var
FR: PR;
FList: TList;
r: TR;
idx: Integer;
p: Pointer;
S: Extended;
begin
FList := TList.Create;
new(FR);
FR^.a := 3453.0;
FR^.b := 123.2;
FR^.c := 55.1;
FList.Add(FR);
p := FList.Items[0];
idx := 1;
inc(cardinal(p), sizeof(Extended) * idx);
s := Extended(p^);
ShowMessage(floattostr(s));
← →
PVitaliy (2003-11-10 18:03) [11]>panov © (10.11.03 16:08) [4]
>А ты добавь вот такое поле и попробуй снова:
>type
>TR = record
>s: String[10];
>a: string;
>b: string;
>c:string;
>end;
String и String[10]=ShortString это совсем разные типы, которые по разному представлены в памяти, и для такого рекорда код, приведенный выше, работать не будет.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.11.20;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.012 c