我有一些旧的(~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。
问题如下:
有人可以帮我这个吗?提前谢谢。
答案 0 :(得分:2)
据我所知,这基本上是Hollerith encoding,用整数编码字符常量(在有CHARACTER数据类型之前从后面编码)。作为一个快速测试,设置其中一个等于4HKYAN的整数似乎给出了相同的答案。
这里的原因似乎是设置一个等于某个常量的标志来进行后续测试。如果你想做同样的事情,现代的方法是ckyan = transfer('KYAN',ckyan)
,它取字符串的位表示,将其转换为作为第二个参数传递的变量的格式,并返回它。
但是在这里,看起来命名常量的值并不重要,只要IWVTX可以承担不同情况的值是不同的......
顺便说一下,您可能已经知道了这一点,但Fortran Wiki在Modernizing Old Fortran上有一个非常方便的页面;它并不能涵盖所有内容(就像我之前从未见过的那样),但它有助于将许多旧的,非标准的结构翻译成现代的Fortran。