无法在f77中初始化无类型字符

时间:2016-11-30 18:43:56

标签: fortran gfortran fortran77

我尝试分配水平表

  character*(*) argz(*),tab*1
  data tab /Z'09'/

使用f77gfortran进行编译

   data tab /Z'09'/
      1 Error: Incompatible types in DATA statement at (1); attempted conversion of INTEGER(16) to CHARACTER(1)

1 个答案:

答案 0 :(得分:2)

如评论所述,如果您只是想要一个ASCII制表符,那么ACHAR(9)会提供这样的东西。但是,这个问题的其他方面使得它更加通用。

Z'09'等文字常量称为BOZ常量。这代表了一系列的比特。

在Fortran标准中使用BOZ常量非常受限制(随着时间的推移变得越来越少),并且许多编译器允许超出标准的其他用途作为扩展。例如,Fortran兼容程序中的BOZ常量可能只出现在少数几个地方。有些编译器可能允许它们以任何方式显示为文字常量。

您在注释中指向的Oracle documentation甚至让该编译器允许从其使用中假定表达式的类型。

使用编译器,尝试

character tab
data tab /Z'09'/

失败。 gfortran消息说,它将常量设为integer(16),其(正确)无法转换为character。此外,根据Fortran标准,data语句中由BOZ常量定义的任何数据对象都必须是整数。

我们知道

character :: tab=ACHAR(9)  ! This is also explicit initialization.

有预期的效果,但是我们可以用BOZ常数来做这个吗?

你指向gfortran documentation of achar并说它没有引用十六进制的参数。它说I必须是整数。 BOZ常量不是整数,因此Fortran不允许achar(Z'09')。 [虽然这实际上是由gfortran和其他编译器接受的。]

完全符合标准的方法

character :: tab=ACHAR(INT(Z'09'))

因为int接受这些常量,返回一个整数(achar可以接受)。

常量表达式achar(int(z'09'))本身可能不会出现在data语句中,如

character tab
data tab /ACHAR(INT(Z'09'))/  ! No...

因为它不是常数。但是,我们可以

character, parameter :: tabconst=ACHAR(INT(Z'09'))
character tab
data tab /tabconst/  ! tabconst is a (named) constant