【发布时间】:2019-06-21 09:16:09
【问题描述】:
我有一个 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
我可以在 Windows 中使用 IFORT 2016、Linux 中的 IFORT 2016 和 Linux 中的 gfortran 成功编译此 Fortran 模块。
为了测试,我创建了一个简短的 Fortran 程序:
PROGRAM Test
USE X
WRITE(*, *) "Name: ", get_name()
END PROGRAM
我可以在 Windows 中使用 IFORT 2016、Linux 中的 IFORT 2016 和 Linux 中的 gfortran 成功编译这个 Fortran 程序。
现在,当运行该程序时,它在 IFORT 2016 for Linux 中运行良好,gfortran 在 Linux 中运行良好,但在 IFORT 2016 for Windows 中运行良好。它实际上给出了以下错误:
forrtl: severe (157): Program Exception - access violation
知道如何解决这个错误吗?
【问题讨论】:
标签: fortran intel-fortran