我应该为Fortran中的字符类型做什么?

时间:2010-03-04 02:56:46

标签: c# interop fortran

我从C#调用fortran子程序。我必须传入的参数之一是字符.i.e,在fortran中,参数声明为

character, intent(in)  ::  bmat*1

现在的问题是,在C#代码中,我应该将它编组为什么?我知道对于integer,我应该将其整理为[MarshalAs(UnmanagedType.I4)],但character怎么办?

修改:这是我的fortran代码:

  subroutine chartest(bmat)
    !DEC$ ATTRIBUTES DLLEXPORT::chartest
    !DEC$ ATTRIBUTES ALIAS:'chartest'::chartest
    !DEC$ ATTRIBUTES VALUE ::bmat
    character, intent(in)  ::  bmat*1
    if(bmat .eq. 'G')then
        print *, bmat
    else
        print *, ' no result '
    endif
   end

这是我的互操作代码:

    [DllImport(@"eigensolver_win32.dll")]
    public static extern void chartest( [MarshalAs(UnmanagedType.U1)] char bmat);

这就是我称之为例程的方式:

    char bmat = 'G';
    EigenSolver32.chartest(bmat);

我得到的结果是“没有结果”,表明if未得到满足。

1 个答案:

答案 0 :(得分:2)

FORTRAN中的character类型是无符号8位数。

[MarshalAs(UnmanagedType.U1)]

会工作。

签署了非标准FORTRAN byte类型。它将是UnmanagedType.I1

编辑:C#char类型是Unicode(16位)类型。 C#byte类型是与FORTRAN字符类型匹配的类型。

[DllImport(@"eigensolver_win32.dll")]
public static extern void chartest( [MarshalAs(UnmanagedType.U1)] byte bmat);

另外,如果我没记错,所有FORTRAN函数参数都是通过引用传递的,所以你可能需要这样做。

[DllImport(@"eigensolver_win32.dll")]
public static extern void chartest( [MarshalAs(UnmanagedType.U1)] ref byte bmat);

我认为[MarshalAs(UnmanagedType.U1)]对于字节是多余的。