我有以下FORTRAN:
SUBROUTINE MYSUB(MYPARAM)
!DEC$ ATTRIBUTES DLLEXPORT::SetPaths
CHARACTER*50 MYPARAM
WRITE(6, *) MYPARAM
END SUBROUTINE
然后我在C#中有以下内容
class Program
{
static void Main(string[] args)
{
StringBuilder sb = new StringBuilder(50);
sb.Append(@"something");
MYSUB(sb);
Console.ReadLine();
}
[DllImport(@"myCode.dll", EntryPoint = "MYSUB")]
public static extern void MYSUB(StringBuilder input);
}
然而,我的FORTRAN中的WRITE在“某事”之后显示了一堆垃圾。看起来字符串终止符没有被尊重。救命啊!
答案 0 :(得分:2)
字符串是在不同语言之间交换的最棘手的数据类型。
基本的Fortran字符串是固定长度,末端用空格填充。 (Fortran现在有可变长度的字符串,但那些更难以交换。)内在的“修剪”用于抑制尾随空白; “len_trim”提供长度较少的尾随空白。
C标记带有空字符的字符串的结尾。
我不知道C#如何处理字符串 - 内部变量的长度?终结者??
但是Fortran不会理解C#的表示,它只会看到声明的字符串的全长,在这种情况下,包括未初始化的内存。最好的解决方案可能是将字符串的剩余部分初始化为C#中的空白。