コメントはこのフレーズにはあまりにも限定されているため、これを回答として投稿しています。
この答えは、FORTRANやDelphiで配列やレコードのメモリレイアウトの違いを説明しようとしてTodd Grigsbyでanswerを改訂し、Remy Lebeauによってanswer(私は両方をupvoted)。
FORTRANといくつかの他の計算中心言語には、ネストされた配列がcolumn major orderに格納されています。 Delphiなどの多くの言語ではrow major orderを使用しています。
メモリの観点から、レコードはフィールドの配列よりも何もありません:
が
- が名前を持っていないインデックス
- は、計算集約型のために、異なるタイプ
を持っているかもしれませんあなたのアルゴリズムが列を好むときには、ネストされた配列の列の主な順序を格納するのが理にかなっています。行の主要な順序と同じです。したがって、ループではmatch the order of your indexes with the order of your storageが必要です。
TYPE WallInfo
CHARACTER(len=40) :: Name
REAL :: Azimuth
REAL :: Tilt
REAL :: Area
REAL :: Height
END TYPE WallInfo
TYPE(WallInfo), ALLOCATABLE, DIMENSION(:) :: Wall
とデルファイの機能的等価物定義:FORTRAN、このレコードと配列の定義が与えられる
type
WallInfo = record
Name: array[0..39] of Char;
Azimuth: Real;
Tilt: Real;
Area: Real;
Height: Real;
end;
var
Wall: array of WallInfo;
3個のWallInfo素子のアレイ、 これは、どのようにメモリレイアウトであります(すべて連続したメモリ領域になるはずですが、読みやすくするために行を分けています):
in FORTRAN:
Delphiで
Name[0,0]...Name[0,39], Name[1,0]...Name[1,39], Name[2,0]...Name[2,39],
Azimuth[0], Azimuth[1], Azimuth[2],
Tilt[0], Tilt[1], Tilt[2],
Area[0], Area[1], Area[2],
Height[0], Height[1], Height[2],
に:
Name[0,0]...Name[0,39], Azimuth[0], Tilt[0], Area[0], Height[0],
Name[1,0]...Name[1,39], Azimuth[1], Tilt[1], Area[1], Height[1],
Name[2,0]...Name[2,39], Azimuth[2], Tilt[2], Area[2], Height[2],
ので、このFORTRANコール:
CALLの熱流(ウォール%エリア、ウォール%方位)
だけのエリアへのポインタを渡します[ 0]とAzimuth [0]のメモリ位置と関数に対するメモリ領域の長さです。 Delphiで
、それができない、あなたは
- に持っているように、新しいエリアを構築し、方位arays
- ウォール
- 呼ばWallInfoレコードインスタンスの配列の情報からそれらをコピーしてそれらを送信機能
- 場合にこれらは、VARパラメータです:
ウォールに戻って二つの配列からの変更をコピーTodd GrigsbyとRemy Lebeauは、ストレートのDelphiコードまたはDelphiのレコードRTTIを使用して最初の3つのステップを示しました。
手順4も同様です。
両方のソリューションは、Delphi 2009で導入されたジェネリックを使用しています。
Until Delphi 2010, RTTI on records was very minimal)、両方の回答で適切なデルファイバージョンを取得しました。
メモ:(もう一度):アルゴリズムをFORTRANからDelphiに変換するときは、列/行の大きな変更のために配列内のループやその他のインデックス付けを監視してください。
ArrayInfoのケース配列で配列やレコードを試しましたか? Delphiはダイナミックアレイをサポートしています。最初に新しい値を入力する前にSetLengthの配列のサイズを設定します。 –
RemyのRTTIの答えが涼しいので、上記のレコードタイプを別々の線形配列に変換したいと思うでしょう: 'Name:String of Array;方位角:Doubleの配列。 ... 'そして、私はこの素敵なRTTIハックを使ってデータを集める必要はないでしょう。すでに集められているからです。 –