使用gfortran编译时出现“DATA INT /'STRING'/”问题

时间:2011-04-18 13:57:22

标签: fortran gfortran g77

我有一些旧的(~1995)遗留的fortran代码,它是用g77编译器编译的,并且在gfortran上失败了。 问题出在以下几行(不兼容的类型转换,字符到整数):

INTEGER  CKYAN
DATA     CKYAN / 'KYAN' /

变量CKYAN仅用作触发器一次:

IF(IWVTX.EQ.CKYAN)THEN
    CALL FDCVERTEXSWITCHTOKYAN()
ENDIF

从输入文件中读取整数IWVTX(字符串'KYAN'或其他字符串)。

我在fortran中没有任何重要经验,但是当我从字符串初始化整数变量时,我找不到任何有关正在发生的事情的文档。我已经检查过g77编译器。以下代码:

  INTEGER it,ita,it1,it2,it3,it4,it5,it6
  DATA it  / 'KYAN' /
  DATA ita / 'KYAN' /
  DATA it1 / 'K' /
  DATA it2 / 'Y' /
  DATA it3 / 'A' /
  DATA it4 / 'N' /
  DATA it5 / 'O' /
  DATA it6 / 'o' /
  write(*,*) 'test', it, ita, it1, it2, it3, it4, it5, it6

产生输出:

1312905547 1312905547 538976331 538976345 538976321 538976334 538976335 538976367

因此,如果字符串相等,则数字也相等。如果一个字母紧挨着另一个字母,那么它的代码将增加1。

问题如下:

  1. 这里发生了什么?
  2. 是否有一个功能相同且可用的gfortran?
  3. 或者是否有一种简单的方法可以解决这个问题,而不是接触任何其他文件?
  4. 有人可以帮我这个吗?提前谢谢。

1 个答案:

答案 0 :(得分:2)

哇 - 这是1995年写的? EEP。

据我所知,这基本上是Hollerith encoding,用整数编码字符常量(在有CHARACTER数据类型之前从后面编码)。作为一个快速测试,设置其中一个等于4HKYAN的整数似乎给出了相同的答案。

这里的原因似乎是设置一个等于某个常量的标志来进行后续测试。如果你想做同样的事情,现代的方法是ckyan = transfer('KYAN',ckyan),它取字符串的位表示,将其转换为作为第二个参数传递的变量的格式,并返回它。

但是在这里,看起来命名常量的值并不重要,只要IWVTX可以承担不同情况的值是不同的......

顺便说一下,您可能已经知道了这一点,但Fortran Wiki在Modernizing Old Fortran上有一个非常方便的页面;它并不能涵盖所有内容(就像我之前从未见过的那样),但它有助于将许多旧的,非标准的结构翻译成现代的Fortran。