可以在没有任何长度规范的情况下声明Fortran中的多字符常量吗?

时间:2015-05-04 18:44:34

标签: fortran fortran95

我在一个关于编程的入门课程中被告知了 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的一部分 澄清这一点的标准?

2 个答案:

答案 0 :(得分:3)

Fortran 2008 Standard如果没有指定长度,则character的长度为1。这在Cl中给出。 4.4.3.2“字符类型说明符”:

  

4 [...]如果未在a中指定长度   char-selector或* char-length,长度为1。

这与它是字符变量还是命名常量无关。这实际上发生在您的代码中。

同一行出现在Fortran 95 StandardFortran 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并且都符合标准。