2016-05-29 5 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は、おそらく[オブジェクトパスカル]のパスカルのようなものです(http://docwiki.appmethod.com/appmethod/1.13/topics/en/Structured_Types#Records_.28traditional.29) –

+1

なぜこれを行う必要がありますか? 'aArray [5]'が 'TRecord'であることを知っているならば、' TRecord(aArray [5])。aString'で直接型キャストしてアクセスするのはなぜですか? –

答えて

3
私は

を期待通り

は、私はあなたがそれを動作させるための試みの間に、コピーした投稿したものをコード実現が、動作しません 次回、ください郵便番号、あなたの後に」構文エラーを解決しました。また、どうすればが動作しないのかを含めてください。、デバッグを依頼するだけではありません。

私は型エラーを解決したので、コードが機能するようになりましたが、それでも非常に毛深い

十分わめき散らします。

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

は基本的には、算術演算対応のCardinalタイプにキャストする前にaArrayのアドレスを取るのを忘れていました。

これは、型キャスティングが安全でないと考えた理由です。タイプエラーは他のタイプキャストの後ろに隠されていました。

+0

あなたは正しいです!どうもありがとう。 – JimPapas

関連する問題