Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-65938
Serg
2003-11-11 12:28
2003.11.20
TTreeView


1-65920
Poof-poof
2003-11-08 04:40
2003.11.20
Как вставить в форму линк на сайт и ссылку на моё мыло? :)


14-66082
lak
2003-10-28 22:22
2003.11.20
помогите с реакцией ;)


1-65906
Serzh
2003-11-08 15:46
2003.11.20
Преобразование ASCII to ANSI


1-65836
dream
2003-11-07 14:06
2003.11.20
Проблема с редактированием реестра из программы которую запустил





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский