Присвоение целочисленного значения Fortran целевой памяти C, выделенной malloc

Предположим, вы создали Fortran array(:) указателей на память, выделенную в 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

person BastH    schedule 11.06.2020    source источник
comment
Пожалуйста, используйте тег fortran для всех вопросов по Fortran.   -  person Vladimir F    schedule 12.06.2020


Ответы (1)


Вы почти у цели. Просто используйте массив

array(4) = 20

Если код скомпилирован с параметром -g, а затем пройден отладчиком, при достижении destroy_storage вывод p[3] покажет значение 20.

person cup    schedule 11.06.2020
comment
Спасибо большое, КУП! Я не ожидал, что ответ будет таким простым. Думал, что array(:) — это массив указателей на целочисленную память и, следовательно, назначение массива должно быть в строках array(4) => xxx или что-то подобное. Действительно, этот простой способ работает очень хорошо, спасибо! - person BastH; 11.06.2020