我在 Fortran 中有一个主程序。我在Visual Studio 2010上使用Intel Visual Fortran XE 2011.我想使用以 C ++ 编码的函数。我正在使用的函数是获取几个数组(输入 - 从主fortran程序设置)并使用它们形成一个输出数组(返回到主要的fortran程序)。 我采取了以下步骤:
1)我使用Fortran主程序和模块创建了一个Fortran项目,并将其设置为“启动项目”。
2)我创建了一个类型为“static library”的C ++项目。
3)我添加了$(IFORT_COMPILERvv)\compiler\lib\ia32
,如此处http://software.intel.com/en-us/articles/configuring-visual-studio-for-mixed-language-applications
构建C ++静态库没有问题。
我得到的错误是关于fortran程序中real(8)
变量的声明。
对于所有真实(8)声明,我得到以下两个错误,即总共6个错误:
错误#5082:语法错误,找到'('期待以下之一:::%FILL,TYPE BYTE CHARACTER CLASS DOUBLE DOUBLECOMLEX DOUBLEECECISION ...
错误#5082:语法错误,在期待以下之一时找到'::':( *,; [/ = =>
以下是我使用的代码:
主要Fortran计划:
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];
}
}
有人可以帮我解决这个问题吗? 如果将一个完整的数组从fortran程序发送到c ++程序是一个安全或有问题(更好避免)的尝试,请你告诉我吗?
答案 0 :(得分:2)
您的Fortran语法已经用完。你真的有两次。尝试
REAL(C_DOUBLE), INTENT(IN), DIMENSION(*) :: a, b
等
C_DOUBLE是一个命名常量。它恰好具有该处理器的值8。
此外:
m
。m
进行比较,应该是mm
。以这种方式发送整个阵列没有固有的问题。
答案 1 :(得分:0)
我只是设法从C传递变量的值 功能到fortran功能。
我这里粘贴了两个源文件,即main.c和fortran.f 你可以在microsoft visual studio 10中使用这两个文件。之后 按照页面http://software.intel.com/en-us/articles/configuring-visual-studio-for-mixed-language-applications中的建议完成visual studio中的所有设置,您需要进行另一项更改;
现在你可以建立程序......
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