首页 > 解决方案 > 将 Fortran 整数值分配给 malloc 分配的 C 内存目标

问题描述

假设您已经创建了一个 Fortranarray(:)指针,指向 C 中分配的内存malloc(如最佳答案所示,代码在下面重复)。有没有办法通过使用 Fortran 数组(即 iso_c_bindings)将整数值写入这个分配的内存?还是我必须在 C 中执行此操作?

#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

标签: cfortranfortran-iso-c-bindingfortran2003

解决方案


你快到了。只需使用数组

array(4) = 20

如果代码使用 -g 编译,然后使用调试器单步执行,当达到 destroy_storage 时,打印 p[3] 将显示值 20。


推荐阅读