我有以下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
答案 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似乎是相关的。
然而,奇怪的是,在调试器中,甚至在我进行显式填充之前就出现了尾随空格。