Я пытаюсь определить и объявить набор структур в C, а затем взаимодействовать с ними в фортране, прежде чем передать их обратно для управления в функциях C. Я понимаю, что интероперабельность может быть достигнута за счет использования структур c и общих блоков fortran. Я пробовал несколько методов без успеха.
Ограничения: Использование 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()
Всякий раз, когда я пытаюсь это сделать, я получаю сообщение об ошибке «Неразрешенный внешний символ, действительно указанный в функции xxx, и он не компилируется.
Метод в CVFortran Manual:
Фортран
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. Это не дает ошибок, но возвращает нулевые значения для всех моих переменных.
Пример программы:
Фортран
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
С-функция
#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
_Really
, но ни один из ваших кодов не ссылается на такой символ и не обращается к нему. Более того, хотя ваш код C обращается к похожему символуreally_
, он также предоставляет определение этого символа и поэтому не должен вызывать такую ошибку. Нам будет достаточно трудно помочь вам со старой и несколько своеобразной цепочкой инструментов, которую вы используете, поэтому для вас еще важнее, чем обычно, представить минимальный воспроизводимый пример, который действительно демонстрирует проблему. - person John Bollinger   schedule 26.03.2019REAL(4)
- это синтаксис Fortran 90, а число 4 не совпадает с 4, как вREAL*4
stackoverflow.com/questions/838310/fortran-90-kind-parameter Ключевое словоINTERFACE
также является Fortran 90+. - person Vladimir F   schedule 26.03.2019