Fortran 无法初始化f77中的无类型字符

Fortran 无法初始化f77中的无类型字符,fortran,gfortran,fortran77,Fortran,Gfortran,Fortran77,我试着分配水平的桌子 character*(*) argz(*),tab*1 data tab /Z'09'/ 同时使用f77和gfortran编译 如前所述,如果您只是想要一个ASCII制表符,那么就提供这样一个功能。然而,这个问题还有其他方面,这使得它更具普遍性 诸如Z'09'之类的文字常量称为BOZ常量。这表示一系列位 在Fortran标准中,BOZ常量的使用受到很大限制(随着时间的推移,这种限制越来越少),许多编译器允许将标准之外的其他用途用作扩展。例如,Fortran兼容程序

我试着分配水平的桌子

  character*(*) argz(*),tab*1
  data tab /Z'09'/
同时使用
f77
gfortran
编译


如前所述,如果您只是想要一个ASCII制表符,那么就提供这样一个功能。然而,这个问题还有其他方面,这使得它更具普遍性

诸如
Z'09'
之类的文字常量称为BOZ常量。这表示一系列位

在Fortran标准中,BOZ常量的使用受到很大限制(随着时间的推移,这种限制越来越少),许多编译器允许将标准之外的其他用途用作扩展。例如,Fortran兼容程序中的BOZ常量可能只出现在少数地方。某些编译器可能允许它们以文字常量的任何方式显示

您在注释中指向的编译器甚至允许使用假定的表达式类型

使用您的编译器,尝试

character tab
data tab /Z'09'/
失败了。gfortran消息表示,它将常量的类型设置为
integer(16)
,该类型(正确)无法转换为
字符。此外,根据Fortran标准,在
data
语句中由BOZ常量定义的任何数据对象都必须是整数

我们知道

character :: tab=ACHAR(9)  ! This is also explicit initialization.
有理想的效果,但我们能用BOZ常数来实现吗

您指向,并说它没有引用十六进制的参数。它说,
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

请看这里如何使用achar
内在语言您真的需要Fortran 77吗?不允许将BOZ常量指定给角色。谢谢@VladimirF。我用
tab=achar(9)
替换
data…
,解决了这个问题。事实上,我不想选择f77。我一点也不熟悉。但是我正在对现有的f77代码做一些小的修改,这太复杂了,我无法复制(代码背后的数学很糟糕)。@VladimirF你能回答一下吗?我阅读了achar的手册,它没有提到我是oct还是hex。在f77的手册中,
data
语句应该可以工作。奇怪…我不想让它成为一个答案,如果这个答案适合你,我会将它作为一个副本连接。F90甚至F77中的初始化表达式中是否允许使用
achar()
?在F77中当然不允许,但在F95(可能也是F90)中我相信是这样的。然而,尽管
achar(9)
形成了一个F95初始化表达式,
achar(int(z'9'))
没有,因为该标准中存在对BOZ常数的限制。详细信息如下。谢谢。
character, parameter :: tabconst=ACHAR(INT(Z'09'))
character tab
data tab /tabconst/  ! tabconst is a (named) constant