我在一个关于编程的入门课程中被告知了 Fortran95中的字符常量可以无任何长度声明 规范,例如:
character, parameter :: STR = 'Hello World!'
同样的陈述可以在Stephen J. Chapman的书“Fortran”中找到 科学家和工程师95/2003“(第34页),其中说
如果命名常量的类型为CHARACTER,则没有必要 声明字符串的长度。自命名以来 常量与其类型声明在同一行定义, Fortran编译器可以直接计算其中的字符数 字符串。例如,以下语句声明了一个名为 constant error_message是14个字符的字符串'Unknown 错误!”。
CHARACTER, PARAMETER :: ERROR_MESSAGE = 'Unknown error!'
我知道可以使用(len=*)
。但实际上是这样吗
可以完全省略长度选择器吗?
当我使用GFortran和英特尔编译器进行测试时,价值是 总是被截断为第一个字符。还有其他编译器吗? 支持这个?或者有人能指出我是Fortran的一部分 澄清这一点的标准?
答案 0 :(得分:3)
Fortran 2008 Standard如果没有指定长度,则character
的长度为1。这在Cl中给出。 4.4.3.2“字符类型说明符”:
4 [...]如果未在a中指定长度 char-selector或* char-length,长度为1。
这与它是字符变量还是命名常量无关。这实际上发生在您的代码中。
同一行出现在Fortran 95 Standard和Fortran 90 Standard,Cl中。 5.1.1.5两份文件。
我猜Chapman从FORTRAN 77 Standard,Cl获取他的信息。 4.8.1字符常量,尽管此子句未引用命名常量:
字符常量的长度是两者之间的字符数 分隔撇号,除了每对连续 撇号算作单个字符。定界撇号 不计算在内。字符常量的长度必须更大 比零。
除此之外,我在任何标准或编译器文档中都找不到任何参考来支持Chapman的声明。
答案 1 :(得分:1)
Fortran 2008标准(我在官方标准之前引用了最后一个免费提供的草案)在第4.4.3.2节第4段(重点是我的)中说:
CHARACTER内在类型规范中的char-selector和entity-decl或组件中的* char-length- 类型定义的decl指定字符长度。 entity-decl或component-decl中的* char-length指定 单个长度并覆盖char-selector中指定的长度(如果有)。如果未指定* char-length 在entity-decl或component-decl中,char-selector中指定的length-selector或type-param-value是 字符长度。 如果未在char-selector或* char-length中指定长度,则长度为1 。
这表示如果您未通过*len
或(LEN=len)
指定长度,则字符长度为1
。对于具有参数属性(5.3.13)的字符类型,该标准不会产生任何异常(我能找到)。
作者可能拥有一个编译器来实现他的声明作为供应商扩展,但我无法在标准中找到它的基础。我测试了gfortran 5.1.0,ifort 14.0.1和pgf90 11.9并且都符合标准。