Главная страница
    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.011 c
14-66073
dvs
2003-10-30 09:30
2003.11.20
безделье


6-66029
I_Sword
2003-09-24 18:29
2003.11.20
MAC адреса компьютеров в локальной сети


14-66109
Ermek
2003-10-29 06:30
2003.11.20
Нужна помощь


14-66096
isko
2003-10-29 08:50
2003.11.20
про одну игру(тоже навеяло)


3-65745
OlkaGTS
2003-10-31 16:55
2003.11.20
Ошибка ClientDataSet.LoadFromFile





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский