Как передать параметр из C # в FORTRAN с параметром типа CHARACTER * 50? - PullRequest
2 голосов
/ 07 января 2010

У меня есть следующий Фортран:

  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);

}

Однако, ЗАПИСЬ в моем ФОРТРАНЕ показывает кучу мусора после «чего-то». Похоже, что терминатор строки не соблюдается. Помогите!

1 Ответ

2 голосов
/ 07 января 2010

Строки - самый сложный тип данных для обмена между разными языками.

Основная строка Фортрана имеет фиксированную длину, дополненную на конце пробелами. (У Fortran теперь есть строки переменной длины, но их будет сложнее поменять местами.) Внутренняя «обрезка» предназначена для подавления конечных пробелов; "len_trim", чтобы обеспечить длину меньше конечных пробелов.

C помечает конец строки нулевым символом.

Я не знаю, как C # обрабатывает строки - внутренняя переменная для длины ?? терминатор ??

Но Fortran не поймет представления C #, он просто увидит всю длину строки, как объявлено, включая, в данном случае, неинициализированную память. Лучшее решение, вероятно, состоит в том, чтобы инициализировать остаток строки в пробелах в C #.

...