2

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

INTEGER  CKYAN
DATA     CKYAN / 'KYAN' /

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

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

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

我在 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 回答 1

2

哇——这是1995年写的?呃。

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

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

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

顺便说一句,您可能已经知道这一点,但 Fortran Wiki 有一个关于Modernizing Old Fortran的非常方便的页面;它并没有涵盖所有内容(比如这个,我以前从未见过这种形式),但它有助于将许多旧的、非标准的结构转换为现代 Fortran。

于 2011-04-18T14:18:36.013 回答