Oop 创建包装器对象来消除可怕的Fortran代码?
虽然我可以使用最新的编译器,但我必须使用一些遗留的Fortran 代码以一维数组存储大量数据 比如说,Oop 创建包装器对象来消除可怕的Fortran代码?,oop,object,pointers,fortran,legacy-code,Oop,Object,Pointers,Fortran,Legacy Code,虽然我可以使用最新的编译器,但我必须使用一些遗留的Fortran 代码以一维数组存储大量数据 比如说, PROGRAM horrible_coding IMPLICIT EVERYTHING ! Sarcasm REAL, DIMENSION(1000) :: data INTEGER, DIMENSION(50) :: info_location ! Somewhere, info is read in and stored temporarily as info_1, info_2,
PROGRAM horrible_coding
IMPLICIT EVERYTHING ! Sarcasm
REAL, DIMENSION(1000) :: data
INTEGER, DIMENSION(50) :: info_location
! Somewhere, info is read in and stored temporarily as info_1, info_2, etc.
data(1:3) = info_1
data(4:9) = info_2
...
data(134:192) = info_n
DATA
数组中的哪些元素与第二个数组中存储的info
片段之间的关联。比如:
info_location(1) = 1
info_location(2) = 4
info_location(n) = 134
ASSOCIATE(data_for_info_7 => data(info_location(7) : info_location(8) - 1))
对。info\u location
数组的每个元素的值都是指数据数组中可以找到相关信息的第一个元素
因此,例如,如果您想要获取info_7的数据,您必须执行以下操作:
size_of_info_7 = info_location(8) - info_location(7)
ALLOCATE(data_for_info_7(size_of_info_7))
data_for_info_7 = data(info_location(7) : info_location(7) + size_of_info_7 - 1)
到现在为止,看到这种精神错乱可能会让你的眼睛流血,所以我道歉
我想创建对象实例,并将每一条信息的所有相关数据存储为实例数据。当我把事情带到2003年时,我会创建实例方法来获取和设置实例数据
我不想重写代码,但想把这个现代化放在已经存在的基础上
我相信我可以通过使对象实例数据只是指向数据
数组中包含相关信息的实际元素的指针来实现这一点
这样做合理吗
我可以用Fortran创建实例数据主要是指针的对象吗
如果不先向stackoverflow提出这个想法,我会犹豫是否要开始这项任务
我可以用Fortran创建实例数据主要是指针的对象吗
我不确定,你的意思是什么,但你肯定可以做一些事情,比如:
type data_ptr
real,dimension(:),pointer :: data
end type
您还可以制作以下类型的数组:
type(data_ptr),dimension(:),allocatable :: some_name
(也可以是指针或静态,如您所愿。)
然后,如果原始数据具有TARGET
属性,则可以使用:
some_name(i)%data => data(lower:upper)
您还可以将指针重新映射到不同的下限,上面的过程将其设置为下限1。我发现您发布的“代码”有点混乱。我希望你知道这些线
data(1:3) :: info_1
data(4:9) :: info_2
...
data(134:192) :: info_n
在语法上无效的Fortran(任何一代)。我认为我可以解释你试图告诉我们的内容,但我宁愿不提供基于(错误)解释的建议。此外,您可以将诸如info_1、info_2
之类的实体放入混合中,而不必澄清它们的定义和声明。我不确定info\u 1
是否与info\u位置(1)
相同
如果我理解你所发布的内容,你会得到一个相当常见的(在旧的Fortran代码中)结构,其中有一个固定大小的数据数组(这里称为data
),用于存储项目集合。然后有一个索引数组(称为info\u location
),它将索引包含在每个项目开头的数据中。非常奇怪的是,这个索引数组是REAL类型的,我希望它是整数,这样您就可以编写如下语句:
data(info(3):info(4)-1))
data(int(info(3)):int(info(4))-1))
这当然不会让我的眼球流血,也许我用Fortran编程的时间太长了,但对我来说它看起来完全合理!您应该考虑的一个选项是将代码> InfyLoad < /C> >以某种方式将其转换为整数,并将其用作索引数组。或者,您可以在需要时进行这些转换,例如:
data(info(3):info(4)-1))
data(int(info(3)):int(info(4))-1))
就我个人而言,我会制作一个整数索引数组,实数是数组索引的错误类型
然后,你写
因此,例如,如果您想要获取info_7的数据,您必须
请执行以下操作:
size_of_info_7 = info_location(8) - info_location(7)
ALLOCATE(data_for_info_7(size_of_info_7))
data_for_info_7 = data(info_location(7) : info_location(7) + size_of_info_7 - 1)
由于您没有明确说明什么是info\u 7
或data\u for\u info\u 7
,我对此感到有点困惑。如果您使用的是隐式类型,则_info_7的大小_将为实,并且您的ALLOCATE语句将失败,需要为分配对象的大小指定一个整数
我想,信息7的数据可能是一个可分配的实数数组。如果info\u location
为整数类型,您只需编写:
ALLOCATE(data_for_info_7, source = data(info_location(7) : info_location(8) - 1))
Vladimir F已经提供了使用指针清理代码的建议。另一种方法是使用关联构造。您可以在代码中的适当位置编写如下内容:
info_location(1) = 1
info_location(2) = 4
info_location(n) = 134
ASSOCIATE(data_for_info_7 => data(info_location(7) : info_location(8) - 1))
将其与位于正确位置的END ASSOCIATE
语句相匹配。这将有效地为关联构造中的数组部分定义别名
因此,总结一下:
info\u位置
数组的类型错误很明显,在pst的编辑中,我询问的是包装器对象。知道我要做的事情有一个名字,我已经感觉好多了。我已经很多年没有接触fortran了,所以不知道任何对象扩展。然而,我建议在重构代码之前,你应该进行一些验证测试,以确保你不会破坏一些原始的逻辑。是的,信息位置应该是整数。这在示例代码中已修复。