Ваша ошибка здесь:
FUNCTION create_pointer() RESULT(c_intptr_t) BIND(C, name = "create_pointer")
Вы должны поместить имя переменной внутри result
части объявления функции. Затем вы можете использовать имя, которое вы там помещаете внутри тела функции, а значение, которое оно имеет при завершении функции, будет значением результата, возвращаемым функцией.
В вашем коде вы помещаете имя c_intptr_t
, которое совпадает с именем, которое вы только что импортировали из встроенного модуля, и вы фактически перекрываете его. Я не думаю, что это намерение.
Кроме того, как сказал @francescalus, у вас нет implicit none
, поэтому вы позволяете умолчанию неявным правилам Fortran выбрать тип вашей переменной результата; и он выбирает реальное значение по умолчанию (поскольку имя переменной начинается с буквы C), поэтому указатель имеет размер 32 бита.
c_intptr_t
является константой внутри встроенного модуль iso_c_binding
, предназначенный для использования в качестве параметра типа для интероперабельного целого, который получает правильный размер указателя системы.
Вы можете изменить имя переменной внутри результата, например, ptr
, и измените объявление функции на это:
function create_pointer() result(ptr) bind(C, name = "create_pointer")
use, intrinsic :: iso_c_binding, only: c_intptr_t
implicit none
integer(c_intptr_t) :: ptr
end function