У меня есть основная программа в Фортран. Я использую Intel Visual Fortran XE 2011 на Visual Studio 2010. Я хотел бы использовать функцию, которая закодирована в C ++. Функция, которую я использую, получает несколько массивов (input — набор из основной программы fortran) и использует их для формирования выходного массива (который будет возвращен основной программе fortran).
Я предпринял следующие шаги:
1) Я создал проект на Фортране с основной программой и модулем на Фортране и установил его как «проект запуска».
2) Я создал проект C ++ типа «статическая библиотека».
3) я добавил $(IFORT_COMPILERvv)\compiler\lib\ia32
как объяснено здесь http://software.intel.com/en-us/articles/configuring-visual-studio-for-mixed-language-applications
Статическая библиотека C ++ создается без проблем.
Я получаю ошибки об объявлении real(8)
переменные в программе Fortran.
Я получаю следующие две ошибки для всех действительных (8) объявлений, то есть всего 6 ошибок:
ошибка # 5082: синтаксическая ошибка, обнаружена ‘(‘ при ожидании одного из: ::% FILL, ТИП БАЙТА КЛАССА ДВОЙНОЙ DOUBLECOMPLEX DOUBLEPRECISION …
ошибка # 5082: синтаксическая ошибка, найдено ‘::’ при ожидании одного из: (*,; [/ = =>
Вот код, который я использовал:
Основная программа Фортран:
Program Fort_call_C
use iso_c_binding
implicit none
interface
subroutine vec_sum_c(a,b,c) bind (C, name = "vec_sum_c")
use iso_c_binding
implicit none
real(8) (c_double), intent (in), dimension (*) :: a,b
real(8) (c_double), intent (out), dimension (*) :: c
end subroutine get_filled_ar
end interface
integer:: i
integer (c_int)::m
real(8)(c_double),dimension(:):: a, b, c
open(unit=10, file="input_arrays.txt",status="unknown")
read(10,*) m
allocate(a(m),b(m),c(m))
do i=1,m
read(10,*)a(i),b(i)
end do
close(10)
call vec_sum_c(m,a,b,c)
do i=1,m
print*, c(i)
end do
pause
end program
И функция C ++:
extern"C" void vec_sum_c(int *m, double *a, double *b, double *c){
int mm = *m;
for(int i=0;i<=m-1;i++){
c[i]=a[i]+b[i];
}
}
Кто-нибудь может помочь мне с этим вопросом?
И не могли бы вы сообщить мне, является ли идея отправки целого массива из программы на фортране в подпрограмму c ++ безопасной или проблематичной (лучше избегать) попыткой?
Ваш синтаксис Fortran отсутствует. У вас есть настоящий вид дважды. Пытаться
REAL(C_DOUBLE), INTENT(IN), DIMENSION(*) :: a, b
и т.п.
C_DOUBLE является именованной константой. Это имеет значение 8 с этим процессором.
Также:
m
в теле интерфейса Fortran для функции C.m
это должно быть mm
,Не существует внутренней проблемы при отправке целых массивов таким способом.
Мне только удалось передать значение переменной из C
функция в Фортран функции.
Здесь я вставил два исходных файла, а именно main.c и fortran.f.
Вы можете использовать эти два файла в Microsoft Visual Studio 10. После
делать все настройки в visual studio, как указано на странице http://software.intel.com/en-us/articles/configuring-visual-studio-for-mixed-language-applications, вам нужно сделать еще одно изменение как;
теперь вы можете собрать программу ….
main.c:
#include <stdio.h>
#include <malloc.h>
void testc(double **pa, double **p)
{
double b;
double *a, *c;
int m;
c = (double*) malloc(sizeof(double));
*c = 10;
*p = c;
a = (double*) malloc(sizeof(double)*5);
a[0]=1.23;
a[1]=2.46;
a[2]=3.69;
a[3]=4.11;
a[4]=7.21;
*pa=a;
for (m=0;m<5;m++)
{
b=a[m];
b=b+1.0;
a[m]=b;
}
}
fortran.f:
program test
use iso_c_binding
implicit none
interface
subroutine testc(pa, m) bind(c)
use iso_c_binding
type(c_ptr):: m
type(c_ptr):: pa
end subroutine testc
end interface
type(c_ptr) :: pa
type(c_ptr) :: m
real(c_double),pointer::fpa(:)
real(c_double),pointer::fm(:)
call testc(pa,m)
call c_f_pointer(pa, fpa, [5])
call c_f_pointer(m, fm, [1])
print *, fm(1)
print*, fpa(1)
pause
end program test