У меня есть программа на C, которая имеет функцию с именем get_name
.Эта функция возвращает строку (то есть char *
) и изменяет аргумент size
(переданный ей) в соответствии с размером строки:
char *get_name(int &size)
{
*size = strlen(name); // name is a C global variable declared as a char *
return name;
}
Я создал следующий модуль Fortran, чтобы иметь возможностьвызвать функцию C get_name
:
MODULE X
USE, INTRINSIC :: iso_c_binding, ONLY: c_intptr_t
IMPLICIT NONE
INTERFACE
TYPE(c_ptr) FUNCTION get_name_(size) BIND(C, name = "get_name")
USE, INTRINSIC :: iso_c_binding, ONLY: c_int, c_ptr
INTEGER(c_int), INTENT(OUT) :: size
END FUNCTION
END INTERFACE
CONTAINS
FUNCTION get_name()
USE, INTRINSIC :: iso_c_binding, ONLY: c_int, c_char, c_f_pointer, c_ptr, c_associated
!DEC$ ATTRIBUTES DLLEXPORT :: get_name
CHARACTER(LEN = :), ALLOCATABLE :: get_name
INTEGER(c_int) :: size
TYPE(c_ptr) :: c_string
c_string = get_name_(size)
IF (c_associated(c_string)) THEN
BLOCK
CHARACTER(KIND = c_char, LEN = size), POINTER :: f_string
CALL c_f_pointer(c_string, f_string)
get_name = f_string
END BLOCK
ELSE
get_name = ""
END IF
END FUNCTION
END MODULE
Я могу успешно скомпилировать этот модуль Fortran, используя IFORT 2016 в Windows, IFORT 2016 в Linux и gfortran в Linux.
Чтобы проверить,Я создал короткую программу на Фортране:
PROGRAM Test
USE X
WRITE(*, *) "Name: ", get_name()
END PROGRAM
Я могу успешно скомпилировать эту программу на Фортране, используя IFORT 2016 в Windows, IFORT 2016 в Linux и gfortran в Linux.
Теперь при запускепрограмма хорошо работает в IFORT 2016 для Linux, gfortran в Linux, но не в IFORT 2016 для Windows.Фактически выдает следующую ошибку:
forrtl: severe (157): Program Exception - access violation
Есть идеи, как эту ошибку можно решить?