我尝试分配水平表
character*(*) argz(*),tab*1
data tab /Z'09'/
使用f77
和gfortran
进行编译
data tab /Z'09'/ 1 Error: Incompatible types in DATA statement at (1); attempted conversion of INTEGER(16) to CHARACTER(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