20 | type(c_ptr), value :: fName | 1 Error: Derived type ‘c_ptr’ at (1) is being used before it is defined ReadWrite.f90:32:12:
时间: 2024-02-10 19:10:17 浏览: 178
这个错误通常是因为没有正确引入 `iso_c_binding` 模块所导致的。请确保在你的 Fortran 代码中包含以下语句:
```fortran
use iso_c_binding
```
如果你已经包含了这个语句,那么请检查你的编译器是否支持 Fortran 2003 标准。在 Fortran 2003 中引入了 C 指针类型 `C_PTR`,如果你的编译器不支持 Fortran 2003 标准,那么可能无法正确识别 `C_PTR` 类型。在这种情况下,你可以考虑使用 `TYPE(C_PTR)` 替换 `C_PTR`,例如:
```fortran
interface
function my_cpp_read(fName) bind(C, name="my_cpp_read")
import :: c_char, TYPE(C_PTR)
type(C_PTR), value :: fName
logical(c_bool) :: my_cpp_read
end function my_cpp_read
end interface
```
这应该可以解决你遇到的问题。
相关问题
45 | type(c_ptr) :: my_char_ptr = c_loc(file_name) | 1 Error: Intrinsic function ‘c_loc’ at (1) is not permitted in an initialization expression ReadWrite.f90:46:58:
这个错误是因为在Fortran中,初始化表达式中不允许使用c_loc这个内置函数。你可以将这个初始化语句放到程序的某个子程序中,或者使用一个变量来存储c_loc(file_name)的值,然后再将这个变量赋值给my_char_ptr。例如:
```
type(c_ptr) :: my_char_ptr
character(len=100) :: file_name
integer(c_intptr_t) :: file_ptr
file_ptr = c_loc(file_name)
my_char_ptr = c_ptr(file_ptr)
```
这样就可以避免在初始化表达式中使用c_loc的问题了。
27 | type(c_ptr) :: fullName | 1 Error: Unexpected data declaration statement at (1) ReadWrite.f90:28:42:
这个错误提示意味着你在 `interface` 块中使用了不支持的数据声明语句。在 `interface` 块中,你只能声明函数的签名,不能声明变量。如果你需要声明变量,应该将其放在 `function` 块内部。具体来说,你可以将 `fullName` 的声明从 `interface` 块中移除,并将其放到 `function` 块的开头,像这样:
```
interface
function my_cpp_read(fullName) bind(C, name="my_cpp_read")
use, intrinsic :: iso_c_binding, only: c_ptr, c_char
implicit none
type(c_ptr), value :: fullName
logical(c_bool) :: my_cpp_read
import :: C_CHAR
! 将 Fortran 字符串转换为 C 字符串
character(kind=c_char), dimension(:), pointer :: fullName_c
integer(c_int) :: fullName_len
fullName_c = c_f_pointer(fullName, [fullName_len])
fullName_c(fullName_len+1) = c_null_char ! 添加字符串终止符
! 调用 C++ 函数
my_cpp_read = my_cpp_read(fullName_c)
end function my_cpp_read
end interface
function my_cpp_read(fullName) bind(C, name="my_cpp_read")
use, intrinsic :: iso_c_binding, only: c_ptr, c_char
implicit none
type(c_ptr), value :: fullName
character(kind=c_char), dimension(:), pointer :: fullName_c
integer(c_int) :: fullName_len
logical(c_bool) :: my_cpp_read
! 将 Fortran 字符串转换为 C 字符串
fullName_c = c_f_pointer(fullName, [fullName_len])
fullName_c(fullName_len+1) = c_null_char ! 添加字符串终止符
! 调用 C++ 函数
my_cpp_read = my_cpp_read(fullName_c)
end function my_cpp_read
```
在这个例子中,我们将 `fullName` 的声明从 `interface` 块中移除,并将其放到了 `function` 块的开头。注意,为了能够正确地将 Fortran 字符串转换为 C 字符串,我们需要在 `function` 块中声明 `fullName_c` 和 `fullName_len` 两个变量。同时,我们也需要在 `function` 块中重新声明 `my_cpp_read` 的类型。
阅读全文