Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.11.20;
Скачать: CL | DM;

Вниз

доступ к полю 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.03 c
1-65833
AndreyA
2003-11-10 09:17
2003.11.20
SetWindowLong


1-65974
Шурик
2003-11-10 22:55
2003.11.20
Где найти исходники приличных программ...


1-65895
Xedin
2003-11-08 14:42
2003.11.20
writeln и printf ??????????????


14-66085
XinSide
2003-10-23 20:51
2003.11.20
Приветик


8-66016
Puliay
2003-07-16 15:52
2003.11.20
Проигрывание мультимедиа файлов nonstop