Я пытаюсь определить и объявить набор структур в C, а затем взаимодействовать с ними в фортране, прежде чем передать их обратно для манипулирования в C-функциях. Я понимаю, что совместимость может быть достигнута с помощью структур c и общих блоков. Я попробовал несколько методов безуспешно.
Ограничения: использование cvfortran, f77. Нереально конвертировать в новые форматы. Для C, используя компилятор MSVS C.
Вот предложение из руководства cvfortran, стр. 618:
(http://jp.xlsoft.com/documents/intel/cvf/cvf_pg.pdf)
"В качестве примера, предположим, что ваш код на Фортране имеет общий блок с именем Really,
как показано: "
!DEC$ ATTRIBUTES ALIAS:'Really' :: Really
REAL(4) x, y, z(6)
REAL(8) ydbl
COMMON / Really / x, y, z(6), ydbl
"Вы можете получить доступ к этой структуре данных из вашего кода C с помощью следующих внешних
структура данных: "
#pragma pack(2)
extern struct {
float x, y, z[6];
double ydbl;
} Really;
#pragma pack()
Всякий раз, когда я пытаюсь это сделать, я получаю сообщение об ошибке «Неразрешенный внешний символ» _Really ссылается в функции xxx, и он не компилируется.
Метод в CVFortran Manual:
Fortran
PROGRAM MYPROG
!DEC$ ATTRIBUTES ALIAS:'Really' :: Really
REAL(4) x, y, z
COMMON / Really / x, y, z
INTERFACE
SUBROUTINE STRUCTFUN()
cDEC$ ATTRIBUTES C, ALIAS:'_StructFun' :: STRUCTFUN ! for calling C functions
END SUBROUTINE STRUCTFUN
END INTERFACE
X = 6.
Y = 5.
Z = 0.
CALL STRUCTFUN()
END PROGRAM
C
#include <stdio.h>
void StructFun(void)
{
#pragma pack(2)
extern struct {
float x, y, z;
} Really;
#pragma pack()
printf("x: %f\n y: %f\n z: %f\n", Really.x, Really.y, Really.z);
printf("From C \n");
}
Итак, я попробовал то, что вставил ниже, в котором я определяю тип структуры в заголовочном файле, а затем попытался сделать его внешним по отношению к c. Я должен также упомянуть, что я экспортирую функцию C как dll с файлом .def, чтобы ее можно было вызывать из моего модуля fortran. Это не дает ошибок, но возвращает нулевые значения для всех моих переменных.
Пример программы:
Fortran
PROGRAM MYPROG
REAL(4) X,Y,Z
COMMON / REALLY / X, Y, Z
INTERFACE
SUBROUTINE STRUCTFUN()
cDEC$ ATTRIBUTES C, ALIAS:'_StructFun' :: STRUCTFUN ! for calling C functions
END SUBROUTINE STRUCTFUN
END INTERFACE
X = 6.
Y = 5.
Z = 0.
CALL STRUCTFUN()
END PROGRAM
C функция
#include "structProg.h"
rtype really_;
void StructFun(void)
{
printf("x: %f\n y: %f\n z: %f\n", really_.x, really_.y, really_.z);
printf("From C \n");
}
Заголовочный файл C
#include <string.h>
#include <stdio.h>
typedef struct{
float x;
float y;
float z;
} rtype;
extern rtype really_;
extern void StructFun(void);
Я знаю, что спрашивать об этом будет натянуто, поскольку я использую старый компилятор, но любое руководство будет оценено.
Я также попробовал метод, перечисленный здесь: http://www.yolinux.com/TUTORIALS/LinuxTutorialMixingFortranAndC.html