Что я должен сделать MarshalAs для типа символов в Фортране? - PullRequest
1 голос
/ 04 марта 2010

Я вызываю фортрановую подпрограмму из C #.Один из параметров, который я должен передать, это символ .ie, в Фортране этот параметр объявлен как

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 Ответ

2 голосов
/ 04 марта 2010

Тип character в FORTRAN - это 8-разрядное число без знака.

[MarshalAs(UnmanagedType.U1)]

Будет работать.

Нестандартный тип FORTRAN byte подписан. это было бы UnmanagedType.I1

Редактировать: тип символа C # является типом 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)] избыточен для байта.

...