2016-05-29 3 views
1

У меня есть массив традиционных записей.Доступ к полям (традиционной) записи

Как получить доступ к полю N-й записи, когда я знаю адрес начала записи, смещение поля и тип поля? например.

type 
Tstring = string[20]; 
TRecord = packed record 
    aInteger : integer; 
    aDouble : double; 
    aString : Tstring ; 
    bString : string; 
end; 

var 
aArray : array[0..N] of Trecord; 
p : pointer; 

.... 
p := pointer(cardinal(aArray[5])+12); // 12 = offset of field "aString" 
writeln(Tstring(p^); 

и так далее ...

это не работает, как я ожидал. Где я ошибаюсь, пожалуйста?

+3

Пожалуйста, добавьте тег языка и немного объясните, что вы подразумеваете под традиционной записью в этом контексте? – paisanco

+0

@paisanco выглядит как некоторый аромат паскаля, возможно [object pascal] (http://docwiki.appmethod.com/appmethod/1.13/topics/en/Structured_Types#Records_.28traditional.29) –

+1

Зачем вам это нужно ? Если вы знаете, что 'aArray [5]' является 'TRecord', почему бы просто не прибегнуть к типу и доступу напрямую с помощью TRecord (aArray [5]). AString'? –

ответ

3

не работает, как я ожидал

Я понимаю, что код вы опубликовали скопирована в промежутке между попытками заставить его работать, но в следующий раз, пожалуйста, почтовый индекс после того как вы» ve устранены синтаксические ошибки. Также, пожалуйста, укажите, как он не работает, не просто попросите нас отладить для вас.

Достаточно разглагольствования

Я разрешил тип ошибку, поэтому код теперь работает, но все еще очень волосатые.

p := pointer(cardinal(@aArray[5])+12); // 12 = offset of field "aString" 
writeln(Tstring(p^)); 

В принципе, вы забыли взять адрес aArray перед заливкой его в арифметике с поддержкой Cardinal типа.

Именно поэтому типизация считается небезопасной. Ошибка типа была хорошо скрыта за другим типом.

+0

Вы правы! большое спасибо. – JimPapas

Смежные вопросы