Я работаю над проектом, в котором мне нужно использовать библиотеку Fortran на C. В библиотеке Fortran есть общий блок, содержащий сложный массив * 16, 4x4. Теперь в C сложная переменная представляет собой просто структуру, содержащую два элемента, и, поскольку она является комплексной * 16, элементы должны быть длинными двойными, что является соответствующим типом данных C в Фортране. Итак, у меня есть структура с двумя длинными двойниками.
Я должен получить доступ к элементам этого массива. Хорошо, что я уже могу сделать это вместе со всеми другими общими переменными библиотеки. Проблема в том, что элементы, которые я импортирую из массива,
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.
Любая помощь будет полезна.
long double
. По моему (ограниченному) опыту Cdouble
соответствует Fortranreal*8
. Аcomplex*16
по сути является паройreal*8
-ов. Вы пытались сделать игрушечный код на Фортране с общим блоком только изreal*8
? - person ev-br   schedule 01.11.2011double
, а неlong double
? А, э-э, случайно нет ошибок на единицу? --- Коды Fortran часто используют массивы с отсчетом от 1 вместо отсчета от 0. - person ev-br   schedule 01.11.2011