2010-03-04 54 views
1

我正在從C#調用fortran子例程。我有傳遞的參數是性格.i.e,在FORTRAN該參數被聲明爲我應該爲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 i沒有完成。

+0

那麼最終爲你工作的是什麼? – 2010-03-04 04:21:06

+0

@John,你的答案正在工作 – Graviton 2010-03-04 05:33:42

+0

你是否需要使用'ref byte'? – 2010-03-04 06:09:20

回答

2

FORTRAN中的character類型是無符號8位數。

[MarshalAs(UnmanagedType.U1)] 

將工作。

非標準FORTRAN byte類型已簽名。它會是UnmanagedType.I1

編輯:C#字符類型是一個Unicode(16位)類型。 C#byte類型是與FORTRAN字符類型匹配的類型。另外,如果我沒記錯的話,所有的FORTRAN函數參數都是通過引用傳遞的,所以你可能需要這個參數。

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

而且我認爲[MarshalAs(UnmanagedType.U1)]是冗餘的字節。

+0

謝謝,我照你的說法做了。但是當我使用if語句檢查fortran程序中的'bmat'('if(bmat .eq。'G')')時,它返回一個false。我做錯了什麼? – Graviton 2010-03-04 03:32:25

+0

我們需要看到更多的代碼,包括C#代碼。 – 2010-03-04 03:36:59

+0

而且,如果我做'print *,bmat',我會返回'​​G'。這真的很奇怪。 – Graviton 2010-03-04 03:37:39

相關問題