我从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
未得到满足。
答案 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)]
对于字节是多余的。