将数组从fortran传递给C ++函数

时间:2013-05-02 05:25:53

标签: c++ fortran fortran-iso-c-binding

我在 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 ++程序是一个安全或有问题(更好避免)的尝试,请你告诉我吗?

2 个答案:

答案 0 :(得分:2)

您的Fortran语法已经用完。你真的有两次。尝试

REAL(C_DOUBLE), INTENT(IN), DIMENSION(*) :: a, b

C_DOUBLE是一个命名常量。它恰好具有该处理器的值8。

此外:

  • 您缺少C函数的Fortran接口主体中的参数m
  • 你在开始和结束语句之间改变了关于Fortran接口体中子例程名称的想法!
  • 您的C ++ for循环小于等于与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中的所有设置,您需要进行另一项更改;

  1. 转到C / C ++静态库的项目属性;
  2. 转到C / C ++
  3. 转到代码生成
  4. 将运行时库设置为多线程调试(/ MTd)
  5. 现在你可以建立程序......

    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