如何使用CHARACTER * 50类型的参数将参数从C#传递给FORTRAN?

时间:2010-01-07 04:51:56

标签: c# fortran

我有以下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在“某事”之后显示了一堆垃圾。看起来字符串终止符没有被尊重。救命啊!

1 个答案:

答案 0 :(得分:2)

字符串是在不同语言之间交换的最棘手的数据类型。

基本的Fortran字符串是固定长度,末端用空格填充。 (Fortran现在有可变长度的字符串,但那些更难以交换。)内在的“修剪”用于抑制尾随空白; “len_trim”提供长度较少的尾随空白。

C标记带有空字符的字符串的结尾。

我不知道C#如何处理字符串 - 内部变量的长度?终结者??

但是Fortran不会理解C#的表示,它只会看到声明的字符串的全长,在这种情况下,包括未初始化的内存。最好的解决方案可能是将字符串的剩余部分初始化为C#中的空白。