“DATA INT / 'STRING' /” problem when compiling with gfortran

做~自己de王妃 提交于 2019-12-01 08:34:48

问题


I have some old (~1995) legacy fortran code which is compiled with g77 compiler and fails on gfortran. The problem is in following lines (incompatible types conversion, character to integer):

INTEGER  CKYAN
DATA     CKYAN / 'KYAN' /

The variable CKYAN is used only once as trigger:

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

The integer IWVTX is read from input file (string 'KYAN' or some other string).

I do not have any significant experience in fortran and I fail to find any documentation on what is going on when I initialize integer variable from the string. I have checked with the g77 compiler. The following code:

  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

produces the output:

1312905547 1312905547 538976331 538976345 538976321 538976334 538976335 538976367

So, if the strings are equal the numbers are also equal. If one letter goes next to the other, it's code is incremented by 1.

The questions are the following:

  1. What is going on here?
  2. Is there a function that does the same and available gfortran?
  3. Or is there a simple way to fix this, not touching any other files?

Can anybody help me with this? Thank you in advance.


回答1:


Wow - and this was written in 1995? Eep.

As far as I can tell, this is basically Hollerith encoding, encoding character constants in integers (from back before there was a CHARACTER data type). As a quick test, setting one of those integers equal to 4HKYAN seems to give the same answer.

The reason for this here just seems to be to set a flag equal to some constant to test against afterwards. If you want to do the same thing, the modern way to do this is ckyan = transfer('KYAN',ckyan), which takes the bit representation of the character string, converts it to the format of the variable passed as it's second parameter, and returns it.

But here, it looks like the value of the named constant isn't critical as long as the values IWVTX can take on for the different cases are distinct...

By the way, you may already know about this, but the Fortran Wiki has a very handy page on Modernizing Old Fortran; it doens't cover everything (like this one, which I hadn't seen in quite this form before), but it has help for translating a lot of old, non-standard contstructs into modern Fortran.



来源:https://stackoverflow.com/questions/5703952/data-int-string-problem-when-compiling-with-gfortran

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!