我在Fortran中有一个主程序。我在 Visual Studio 2010 上使用 Intel Visual Fortran XE 2011。我想使用一个用C++编码的函数。我正在使用的函数是获取几个数组(输入 - 从主 fortran 程序设置)并使用它们形成一个输出数组(返回到主 fortran 程序)。我已采取以下步骤:
1)我用Fortran主程序和模块创建了一个Fortran项目,并将其设置为“启动项目”。
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 程序中变量的声明。
对于所有 real(8) 声明,我得到以下两个错误,即总共 6 个错误:
错误 #5082: 语法错误,当期望以下之一时发现 '(': :: %FILL , TYPE BYTE CHARACTER CLASS DOUBLE DOUBLECOMPLEX DOUBLEPRECISION ...
错误 #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++ 例程的想法是安全的还是有问题的(最好避免)尝试?