将 Fortran 整数值分配给 malloc 分配的 C 内存目标
Assigning a Fortran integer value to a malloc-allocated C memory target
假设您创建了一个 Fortran array(:)
指针,指向由 malloc
在 C 中分配的内存(如 best answer 所示,代码在下面重复)。有没有办法使用 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
你快到了。只需使用数组
array(4) = 20
如果代码是用 -g 编译的,然后用调试器单步执行,当达到 destroy_storage 时,打印 p[3] 将显示值 20。
假设您创建了一个 Fortran array(:)
指针,指向由 malloc
在 C 中分配的内存(如 best answer 所示,代码在下面重复)。有没有办法使用 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
你快到了。只需使用数组
array(4) = 20
如果代码是用 -g 编译的,然后用调试器单步执行,当达到 destroy_storage 时,打印 p[3] 将显示值 20。