我发布这个作为答案,因为评论是有点太局限了这句话。
此答案试图解释在FORTRAN和Delphi数组和记录的内存布局的差异,并修改了answer通过Todd Grigsby和answer通过Remy Lebeau(I upvoted两者)。
FORTRAN和其他一些以计算为中心的语言在column major order中存储嵌套数组。德尔福和许多其他语言使用row major order。
从存储的角度看,一个创纪录的不是别的,正是那场数组:
对于计算密集操作时,当您的算法偏好列时,存储嵌套数组列的主要顺序是有意义的。行主要订单相同。因此,在循环中,您需要match the order of your indexes with the order of your storage。
鉴于这种记录和数组定义在FORTRAN:
TYPE WallInfo
CHARACTER(len=40) :: Name
REAL :: Azimuth
REAL :: Tilt
REAL :: Area
REAL :: Height
END TYPE WallInfo
TYPE(WallInfo), ALLOCATABLE, DIMENSION(:) :: Wall
和在Delphi功能等价物的定义:
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:
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]和方位角[0]存储器位置和这些存储器区域的长度。
在Delphi中,这是不可能的,所以你必须
- 构建新的区域和方位一阳指
- 从信息复制它们WallInfo记录实例的阵列称为华尔街
- 送进来在功能
- 如果这些VAR参数:复制从两个排列的变化背靠墙
Todd Grigsby和Remy Lebeau显示了使用直接Delphi代码或Delphi记录RTTI的答案中的前三个步骤。
步骤4以类似的方式工作。
这两个解决方案都使用Delphi 2009中引入的泛型。
Until Delphi 2010, RTTI on records was very minimal),所以你为这两个答案都得到了正确的Delphi版本。
注意(再次):当您的算法从FORTRAN转换为Delphi时,请确保您注意由于列/行主要更改而导致的数组中的循环和其他索引。
您是否尝试使用WallInfo的case数组中的数组或记录? Delphi支持动态数组。在你输入新的值之前,首先设置数组的大小和SetLength。 – 2012-08-08 14:54:30
就像Remy的RTTI答案一样酷,我会试图将上面的记录类型转换成单独的线性数组:'Name:String of Array;方位角:Double的数组; ...',然后我不必使用这个可爱的RTTI黑客来收集数据,因为它已经被收集。 – 2012-08-14 16:59:55