2014-12-20 98 views
0

我在將一個二維數組從Fortran傳遞到C時遇到了問題。以下是我的C函數,它只是在屏幕上顯示數組元素。從Fortran傳遞一個二維數組到C

#include <stdio.h> 
void print2(double *arr , int *n) 
{ 
    int y = *n; 
    printf("\n y = %d", y); 
    for(int i =0; i<y; i++) 
    { 
      for (int j = 0; j < y; j++) 
       printf("%.6g", *((arr + i*y) + j)); 
      printf("\n"); 
    } 
} 

我的Fortran代碼到目前爲止是這樣的:

program linkFwithC 
    use, intrinsic :: iso_c_binding 
    implicit none 
    real, dimension(3,3)::a 
    a(1,1)=1 
    a(1,2)=2 
    a(1,3)=3 
    a(2,1)=4 
    a(2,2)=5 
    a(2,3)=6 
    a(3,1)=7 
    a(3,2)=8 
    a(3,3)=9 

    interface 
     subroutine print2(a,n) bind(c) 
     use, intrinsic :: iso_c_binding 
     type(c_ptr)::a 
     integer(C_INT)::n 
     end subroutine print2 
    end interface 

    call print2(c_loc(a),3) 
end program linkFwithC 

我連接這兩個文件的方式是通過創建C函數靜態庫和建立的.lib文件。建立.lib文件後,我將它添加到fortran項目並運行fortran項目。代碼運行時沒有錯誤,n值正確顯示;但是,顯示的數組值都是錯誤的。

請幫忙!

感謝, 阿納斯

+0

你打電話給print2(沒有fortran專家)。如果它是0,那麼它將不會有輸出 –

+0

這是真的,我剛剛添加了電話,並得到以下兩個錯誤: – Anas

+0

錯誤#6631:A在使用顯式接口調用過程時,必須存在非可選實參。 [A]錯誤#6631:使用顯式接口調用過程時,必須存在非可選的實際參數。 [n] – Anas

回答

1

進一步研究後,我能找到解決這個工作如下:

以下是我的C函數:

#include <stdio.h> 
    void print2(void *p, int n) 
    { 
    printf("Array from C is \n"); 
    double *dptr; 
    dptr = (double *)p; 
    for (int i = 0; i < n; i++) 
    { 
     for (int j = 0; j<n; j++) 
      printf("%.6g \t",dptr[i*n+j]); 

     printf("\n"); 
    } 
    } 

以下是我的Fortran代碼:

 program linkFwithC 
     use iso_c_binding 
     implicit none 
     interface 
      subroutine my_routine(p,r) bind(c,name='print2') 
      import :: c_ptr 
      import :: c_int 
      type(c_ptr), value :: p 
      integer(c_int), value :: r 
      end subroutine 
     end interface 


     integer,parameter ::n=3 
     real (c_double), allocatable, target :: xyz(:,:) 
     real (c_double), target :: abc(3,3) 
     type(c_ptr) :: cptr 
     allocate(xyz(n,n)) 
     cptr = c_loc(xyz(1,1)) 

     !Inputing array valyes 

     xyz(1,1)= 1 
     xyz(1,2)= 2 
     xyz(1,3)= 3 
     xyz(2,1)= 4 
     xyz(2,2)= 5 
     xyz(2,3)= 6 
     xyz(3,1)= 7 
     xyz(3,2)= 8 
     xyz(3,3)= 9 


     call my_routine(cptr,n) 
     deallocate(xyz) 
     pause 
     end program linkFwithC 
3

有作爲[現在]代碼所示的幾個問題。

  • print2的Fortran接口中的n參數沒有VALUE屬性,但C函數中的相應參數是按值取值的。考慮將VALUE添加到Fortran聲明中。

  • 同樣的問題出現在指向數組的指針上。 Fortran接口傳遞一個沒有值的指針,C函數需要一個「按值指針」(而不是指向指針的指針)。請注意,這裏不需要明確使用C_PTR,您可以使用數組的實際類型構造一個可互操作的接口。

  • 在大多數平臺上一個Fortran默認REAL是不一樣的一個C雙 - 考慮使用從ISO_C_BINDING那種常數,以確保種在Fortran語言方面的真正的匹配的C.

  • C_LOC要求其參數具有TARGET屬性。將該屬性添加到主程序中變量的聲明中。

+0

您能否詳細說明您對C_LOC的最後一點。我在代碼中的意圖是將數組a的第一個元素的地址傳遞給C函數。 – Anas