FORTRAN的LEN_TRIM是否与传递的参数表现不同?

时间:2010-01-07 08:31:53

标签: fortran

我有以下FORTRAN

  SUBROUTINE SETPATHS(INPUT)
  !DEC$ ATTRIBUTES DLLEXPORT::SetPaths

  CHARACTER*20 INPUT
  CHARACTER*20 DIRECTORY

  DIRECTORY = 'ABCDEFG'

  WRITE(6, *) 'INPUT LEN_TRIM = ', LEN_TRIM(INPUT)
  WRITE(6, *) 'DIRECTORYLEN_TRIM = ', LEN_TRIM(DIRECTORY)

  END SUBROUTINE

我从C#调用函数,传入'ABCDEFG'。

当我在调试器上设置断点时,INPUT和DIRECTORY具有完全相同的字符。两者都有'ABCDEFG'后跟相同数量的尾随空格。

然而,程序输出

  INPUT LEN_TRIM = 20
  DIRECTORYLEN_TRIM = 7

这是正确的行为吗?如果两个字符串具有相同的值,为什么LEN_TRIM会给出不同的结果?

更新:我发现这个记录的问题(虽然它不是我的英特尔8.1编译器)。 http://support.microsoft.com/kb/89131

3 个答案:

答案 0 :(得分:1)

sbo@dhcp-045:~ $ ./a.out 
 INPUT LEN_TRIM =            7
 DIRECTORYLEN_TRIM =            7
sbo@dhcp-045:~ $ more test.f90 
SUBROUTINE SETPATHS(INPUT)

CHARACTER*20 INPUT
CHARACTER*20 DIRECTORY

DIRECTORY = 'ABCDEFG'

WRITE(6, *) 'INPUT LEN_TRIM = ', LEN_TRIM(INPUT)
WRITE(6, *) 'DIRECTORYLEN_TRIM = ', LEN_TRIM(DIRECTORY)

END SUBROUTINE
program test
    character*20 foo
    foo = "ABCDEFG"
    call setpaths(foo)
end program

您使用的是什么编译器?在这里gfortran。

尝试使用ifort

$ ifort -v
Version 8.0
$ ifort test.f90
$ ./a.out 
 INPUT LEN_TRIM =            7
 DIRECTORYLEN_TRIM =            7

我不知道C#接口如何引入问题,但是LEN_TRIM的语义非常简单......如果你说调试中的字符串看起来相同,那就会发生一些非常可疑的事情。

答案 1 :(得分:1)

它可能正在寻找终结者角色,char(0)。它可能与\ n字符

不同

字符串长度未正确传递的其他可能性。 fortran 77字符串作为两个值传递,字符串指针和字符串长度。没有标准传递字符串长度的标准,大多数编译器最后将它作为隐藏参数。可能90对兼容性做同样的事情。

答案 2 :(得分:1)

通过使用尾随空格显式填充我的C#StringBuilder,LEN_TRIM按预期运行。 This Microsoft KB似乎是相关的。

然而,奇怪的是,在调试器中,甚至在我进行显式填充之前就出现了尾随空格。