0

我有一些我正在尝试改进的遗留代码......我喜欢采用的一种方法是使用结构来组织数据而不是等价操作......不寒而栗。这是在 OpenVMS Fortran 6.4 上,我理解它是 Fortran77 加上一些东西(可能是错误的)。

我想像这样初始化一个记录变量:

structure /my_data/
  integer*2   var1
  integer*2   var2
  character*5 NameTag
end structure

record /my_data/ OrganizedData

data OrganizedData /1, 2, 'Fred '/

我知道数据语句是错误的,编译器告诉我的。检查帮助文件,DATA 似乎不支持此版本中的记录变量。任何人都可以确认吗?除了直接分配之外,还有什么建议可以初始化类似的东西吗?

4

3 回答 3

0

我这里只有 Oracle (Sun) 手册,不是来自 OpenVMS,但它实现了相同的 VAX 扩展(完全非标准!)。那里没有描述结构构造函数,您可以使用它在单个表达式中创建结构值。

它还说:

COMMON 语句中不允许有记录字段。

DATA、EQUIVALENCE 或 NAMELIST 语句中不允许记录和记录字段。

SAVE 语句中不允许有记录字段。

如果您可以使用接受 Fortran 90 的编译器,您可以使用

type my_data
  integer*2   var1
  integer*2   var2
  character*5 NameTag
end type

type(my_data) :: OrganizedData

OrganizedData  = my_data(1, 2, 'Fred')

(我在那里留下了同样非标准的 * 符号。)

于 2014-04-08T11:15:29.620 回答
0

这就是你在 DEC Fortran 中的做法:

structure /my_data/
  integer*2   var1 /1/
  integer*2   var2 /2/
  character*5 NameTag /'Fred'/
end structure

record /my_data/ OrganizedData

end

请注意,初始化是在类型上的——这将为该类型的所有变量提供相同的初始值。

于 2014-04-08T16:08:51.093 回答
0

对于该版本的 DEC FORTRAN,如果您希望每个实例具有不同的值,我认为您需要在运行时初始化记录字段。

 OrganizedData.var1 = 1 ! etc.

有一些技巧,比如使用 COMMON 和制作一个在编译时初始化值的 MACRO Assembler PSECT,但我猜这不是你想要的。(如果你是,请告诉我)。

另外,我忘记了它是否是 6.4,但是接收具有静态初始化的传递参数会导致编译器错误或警告。

于 2017-10-05T22:19:16.093 回答