Я хочу объединить C ++ и Fortran вместе. Мой код Fortran будет использовать функцию C ++, а функция C ++ изменяет переменные Fortran и отправляет их обратно. Функция C ++ построена с использованием других кодов C ++, например. функция C ++ будет использовать некоторую подфункцию в другом файле .cpp. Я делаю код Fortran с ifort
и добавляю эту функцию C ++ как один объектный файл test.o в свой make-файл Fortran. Я также поместил все необходимые файлы C ++ .o (support test.o) в make-файл. Показывает ошибку
# 6633, «Тип фактического аргумента отличается от типа фиктивного аргумента».
Вот код.
Код Фортрана
use, intrinsic :: ISO_C_BINDING, only: C_INT, C_DOUBLE
implicit double precision(a-h,o-z),integer(i-n)
Interface
integer (C_INT) function SolveBIE_(x, y, aa, m) BIND(C, NAME='SolveBIE_')
use, intrinsic :: ISO_C_BINDING
implicit none
type (C_PTR), value :: x
type (C_PTR), value :: y
type (C_PTR), value :: aa
integer (C_INT), value :: m
end function SolveBIE_
end Interface
integer (C_INT) :: m
real (C_DOUBLE), ALLOCATABLE, DIMENSION(:,:), target :: x
real (C_DOUBLE), ALLOCATABLE, DIMENSION(:,:), target :: y
real (C_DOUBLE), ALLOCATABLE, DIMENSION(:,:), target :: aa
ALLOCATE(x(0:MAXLEN,MAXINTERFACES))
ALLOCATE(y(0:MAXLEN,MAXINTERFACES))
ALLOCATE(aa(0:MAXLEN,MAXINTERFACES))
Запуск моего кода Fortran
mm = SolveBIE_(x(1,1),y(1,1),aa(1,1),m)
Используя код C ++ и откуда взялась ошибка, на x, y, aa
я использую x(1,1)
вместо x
, потому что при использовании x
возникает другая ошибка
# 6634, "нарушены правила соответствия форм фактических аргументов и фиктивных аргументов" `
Я не понимаю, почему это должно быть x(1,1)
. Почему это работает, а не x
?
Мой код на C ++
#ifdef __cplusplus
extern "C" {
#endif
int solveBIE_(double *ini_bdry_x, double *ini_bdry_y, double *ini_bdry_um, int *fM)
{
double(*bdry_node)[2] = new double[M1][2];
for (int k = 0; k < M; k++) {
bdry_node[k+1][0] = ini_bdry_x[k+1];
bdry_node[k+1][1] = ini_bdry_y[k+1];
bdry_theta[k+1] = Atan(ini_bdry_x[k+1], ini_bdry_y[k+1]);}
... some functions in other .cpp file
SolveBIE_
, кажется мне совершенно ясным (type(c_ptr)
иreal(c_double)
не одно и то же). Что вы в этом не понимаете? - person francescalus   schedule 06.02.2018x
иx(1,1)
. Пожалуйста, всегда показывайте полный код и полное сообщение об ошибке (или весь вывод). - person Vladimir F   schedule 06.02.2018