接口 C 函数与 Fortran 中的结构
Interface C function with structures in Fortran
我想link一个具有 Fortran 中相应结构的 C 函数
struct ovf_file {
bool found;
bool is_ovf;
int n_segments;
struct ovf_file_handle *_file_handle;
};
DLLEXPORT struct ovf_file * ovf_open(const char *filename);
这是我的尝试:
module ovf
use, intrinsic :: iso_c_binding
implicit none
type, bind(c) :: ovf_file
logical(c_bool) :: found
logical(c_bool) :: is_ovf
integer(c_int) :: n_segments
type(c_ptr) :: file_handle
end type ovf_file
end module ovf
program main
use ovf
use, intrinsic :: iso_c_binding
implicit none
type(ovf_file) :: file_handle
interface
function ovf_open(filename) bind ( C, name = "ovf_open" ) result(handle)
character(len=1, kind=c_char), intent(in) :: filename
type(ovf_file) :: handle
end function ovf_open
end interface
file_handle = ovf_open("testfile.ovf"//C_NULL_CHAR)
end program main
这是我通常对接口 C 执行的操作,但 gfortran(或 ifort)不会编译此代码(我什至没有尝试将其 link 编译为 C 二进制文件)。这是编译器输出:
gfortran -c src/fortran_wrapper.f90 [±master ●●]
src/fortran_wrapper.f90:22:30:
character(len=1, kind=c_char), intent(in) :: filename
1
Error: Parameter ‘c_char’ at (1) has not been declared or is a variable, which does not reduce to a constant expression
src/fortran_wrapper.f90:23:22:
type(ovf_file) :: handle
1
Error: Derived type ‘ovf_file’ at (1) is being used before it is defined
src/fortran_wrapper.f90:30:12:
ulala = ovf_open("testfile.ovf"//C_NULL_CHAR)
1
Error: Type mismatch in argument ‘filename’ at (1); passed CHARACTER(1) to REAL(4)
src/fortran_wrapper.f90:30:12:
ulala = ovf_open("testfile.ovf"//C_NULL_CHAR)
1
Error: Can't convert REAL(4) to TYPE(ovf_file) at (1)
为什么它知道模块中的 C 类型,但不知道程序,即使我有相同的 use-clause?为什么我包含了模块还是找不到类型?
我只能找到非常简单的 C 互操作性用例。 None 解释结构或 C 字符串。我该如何正确执行此操作?
您必须在界面中重复 "use iso_c_binding"(就在函数 ovf 之后……)
或者您可以导入 C 符号。很遗憾,接口不知道使用的模块。
我想link一个具有 Fortran 中相应结构的 C 函数
struct ovf_file {
bool found;
bool is_ovf;
int n_segments;
struct ovf_file_handle *_file_handle;
};
DLLEXPORT struct ovf_file * ovf_open(const char *filename);
这是我的尝试:
module ovf
use, intrinsic :: iso_c_binding
implicit none
type, bind(c) :: ovf_file
logical(c_bool) :: found
logical(c_bool) :: is_ovf
integer(c_int) :: n_segments
type(c_ptr) :: file_handle
end type ovf_file
end module ovf
program main
use ovf
use, intrinsic :: iso_c_binding
implicit none
type(ovf_file) :: file_handle
interface
function ovf_open(filename) bind ( C, name = "ovf_open" ) result(handle)
character(len=1, kind=c_char), intent(in) :: filename
type(ovf_file) :: handle
end function ovf_open
end interface
file_handle = ovf_open("testfile.ovf"//C_NULL_CHAR)
end program main
这是我通常对接口 C 执行的操作,但 gfortran(或 ifort)不会编译此代码(我什至没有尝试将其 link 编译为 C 二进制文件)。这是编译器输出:
gfortran -c src/fortran_wrapper.f90 [±master ●●]
src/fortran_wrapper.f90:22:30:
character(len=1, kind=c_char), intent(in) :: filename
1
Error: Parameter ‘c_char’ at (1) has not been declared or is a variable, which does not reduce to a constant expression
src/fortran_wrapper.f90:23:22:
type(ovf_file) :: handle
1
Error: Derived type ‘ovf_file’ at (1) is being used before it is defined
src/fortran_wrapper.f90:30:12:
ulala = ovf_open("testfile.ovf"//C_NULL_CHAR)
1
Error: Type mismatch in argument ‘filename’ at (1); passed CHARACTER(1) to REAL(4)
src/fortran_wrapper.f90:30:12:
ulala = ovf_open("testfile.ovf"//C_NULL_CHAR)
1
Error: Can't convert REAL(4) to TYPE(ovf_file) at (1)
为什么它知道模块中的 C 类型,但不知道程序,即使我有相同的 use-clause?为什么我包含了模块还是找不到类型?
我只能找到非常简单的 C 互操作性用例。 None 解释结构或 C 字符串。我该如何正确执行此操作?
您必须在界面中重复 "use iso_c_binding"(就在函数 ovf 之后……)
或者您可以导入 C 符号。很遗憾,接口不知道使用的模块。