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:
Can anybody help me with this? Thank you in advance.
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.