簡體   English   中英

將可分配數組從 fortran 傳遞給 C 並對其進行 malloc

[英]Passing allocatable array from fortran to C and malloc it

我正在將我們的一些 Fortran 庫代碼轉換為 C,以便我們最終擁有帶有 Fortran 包裝器的 C 函數。 我們使用的是 Fortran 95。

處理可分配數組的首選方法是什么?

  1. 我可以將一個可分配的數組傳遞給 C 函數並在 C 函數中分配它嗎? (C 函數知道要 malloc 的大小)

  2. 在 fortran 程序中,我可以解除分配在 C 函數中分配的內容嗎? 因此,最終客戶端 fortran 應用程序取消分配數組或需要調用釋放內存的 C 函數。

一個小例子或一個鏈接將不勝感激。

在 Fortran 95 中,您不能將可分配數組作為可分配的東西“傳遞”給任何東西,包括 Fortran 過程。

在 Fortran 2003 中,C 函數可以為數組分配存儲空間,然后將其作為來自 ISO_C_BINDING 內部模塊的 C_PTR 返回到 Fortran 端。 然后可以使用 Fortran POINTER 和來自 ISO_C_BINDING 模塊的 C_F_POINTER 過程訪問 C_PTR 指向的存儲。

為了釋放數組的存儲空間,Fortran 端將再次調用 C 過程,傳遞 C_PTR,然后 C 函數在調用 free 時使用它。

#include "stdlib.h"
int *create_storage()
{
   /* Array of four integers. */
   return malloc(sizeof(int) * 4);
}

void destroy_storage(int *ptr)
{
   free(ptr);
}


PROGRAM fortran_side
  USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_PTR, C_F_POINTER, C_INT
  IMPLICIT NONE
  INTERFACE
    FUNCTION create_storage() BIND(C, NAME='create_storage')
      USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_PTR
      IMPLICIT NONE
      TYPE(C_PTR) :: create_storage
    END FUNCTION create_storage
    SUBROUTINE destroy_storage(p) BIND(C, NAME='destroy_storage')
      USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_PTR
      IMPLICIT NONE
      TYPE(C_PTR), INTENT(IN), VALUE :: p
    END SUBROUTINE destroy_storage
  END INTERFACE
  TYPE(C_PTR) :: p
  INTEGER(C_INT), POINTER :: array(:)
  !****
  p = create_storage()
  CALL C_F_POINTER(p, array, [4])   ! 4 is the array size.
  ! Work with array...
  CALL destroy_storage(p)
END PROGRAM fortran_side

在 Fortran 201X 中,可以提供 C 頭文件和函數以允許 C 直接使用 Fortran 可分配變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM