C-Fortran Смешанное Программирование - PullRequest
2 голосов
/ 31 октября 2011

Я работаю над проектом, в котором мне нужно использовать библиотеку Fortran на C. В библиотеке Fortran есть общий блок, содержащий сложный массив * 16, 4x4.Теперь в C комплексная переменная - это просто структура, содержащая два элемента, и, поскольку она сложна * 16, элементы должны быть long double, что является соответствующим типом данных C в Fortran.Итак, у меня есть структура с двумя длинными двойниками.

Я должен получить доступ к элементам этого массива.Хорошо, что я уже могу сделать это вместе со всеми другими общими переменными библиотеки.Проблема в том, что элементы, которые я импортирую из массива:

1) Не в порядке, как должно быть, " даже после учета различия в структуре массива C и Fotran".

2) Хотя большинство элементов правы, два сильно отличаются от того, какими они должны быть.

3) Я получаю правильные элементы (за исключением двух), только если я использую double вместо long double.Когда я использую long double (и правильные преобразования символов), я получаю нечто совершенно иное, что явно указывает на проблему с преобразованиями.

Я исчерпал все объяснения, которые у меня были, но ничего не работает.Мой код для печати массивов в C следующий:

for (j=0;j<=3;j++){
    printf("%s", "\n");
    for(k=0;k<=3;k++){            
        printf("%s %d %s %d %s %s %LE %s %LE %s",
          "(", k+1, "," ,j+1, ")", "{",
          (long double)mssmmixing_.neunmx[k][j].dr,
          " ",
          (long double)mssmmixing_.neunmx[k][j].di,
          "}\n");           
    }
}

Дополнительная информация: Поскольку мне приходится смешивать объектные файлы Fortran, я использую gfortran для компиляции файлов C.Если вместо этого я использую компилятор GNU C, он выдает ошибки о не распознавании подпрограмм gfortran.Это также может быть источником проблемы, может быть, gfortran не распознает длинные двойные числа в C.

Любая помощь будет полезна.

1 Ответ

2 голосов
/ 31 октября 2011

Для смешивания Fortran и C, я рекомендую использовать ISO_C_Binding. Он даже имеет тип Fortran C_LONG_DOUBLE_COMPLEX, который соответствует длинному двойному _Complex типа C - см. http://gcc.gnu.org/onlinedocs/gfortran/ISO_005fC_005fBINDING.html. Как часть языкового стандарта Fortran, эти типы гарантированно совпадут (при использовании совместимых компиляторов). Весьма вероятно, что C_LONG_DOUBLE_COMPLEX на самом деле такой же, как сложный * 16, но вы можете попробовать в Фортране копирование между двумя типами в случае различий в разметке памяти. Вы должны скомпилировать исходные файлы на Фортране с помощью gfortran, а C - с помощью gcc. Проще всего связать с Gfortran. (Или используйте другие "фирменные" компиляторы.)

...