【问题标题】:"DATA INT / 'STRING' /" problem when compiling with gfortran使用 gfortran 编译时出现“DATA INT / 'STRING' /”问题
【发布时间】:2011-04-18 13:57:21
【问题描述】:

我有一些旧的(~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. 或者有没有一种简单的方法来解决这个问题,而不涉及任何其他文件?

谁能帮我解决这个问题?提前谢谢你。

【问题讨论】:

    标签: fortran gfortran g77


    【解决方案1】:

    哇 - 这是 1995 年写的?哎呀。

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

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

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

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

    【讨论】:

    • 谢谢,前缀 4H 似乎做对了。该链接也非常有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-08
    • 2018-05-03
    • 2013-09-22
    相关资源
    最近更新 更多