C混合编程时char *str []对应的Fortran形参是什么
标准没有规定,有什么技巧么? 我一般都是用type(c_ptr) , value :: cstr
character(len=n) , pointer :: fstr
call c_f_pointer( cstr , fstr ) fcode 发表于 2024-6-14 09:10
我一般都是用
type(c_ptr) , value :: cstr
character(len=n) , pointer :: fs ...
你这个是对应char str []吧?
character(c_char) :: str(*)
这个我会 character(c_char) :: str(*) 不好,会被当成字符数组,而不是字符串。
连 Open( 12 , File = str ) 都不行。
char *str [] 这种是指向 char * 的数组吗?那只能定义一个结构体了,用结构体数组。结构体成员又是 type(c_ptr) 本帖最后由 weixing1531 于 2025-3-12 16:22 编辑
fcode 发表于 2024-6-17 16:19
character(c_char) :: str(*) 不好,会被当成字符数组,而不是字符串。
连 Open( 12 , File = str ) 都不行 ...
求助于万能的DeepSeek 我找到了答案
#include <stdio.h>
#include <stdlib.h>
// 声明 Fortran 子程序
extern void process_strings(char *strings[], int *n); //等价char **strings
int main() {
char *strings[] = {"Hello", "Fortran", "World"}; //字符串指针数组
int n = 3;
process_strings(strings, &n); //必须有&n
return 0;
}
! process_strings.f90
SUBROUTINE process_strings(strings, n) BIND(C)
USE, INTRINSIC :: ISO_C_BINDING
IMPLICIT NONE
TYPE(C_PTR), INTENT(IN) :: strings(*)!对应 char *[]
!CHARACTER(LEN=20), INTENT(IN) :: strings(*)!对应char strings[]
INTEGER(C_INT), INTENT(IN) :: n !必须有n
CHARACTER(LEN=:), POINTER :: str => null()
INTEGER :: i, strlen
interface !调用C语言库函数strlen 字符串长度(不含‘\0’)
function C_STRLEN(str_ptr) bind(C,name = "strlen" ) result (len)
use, intrinsic :: ISO_C_BINDING, only: C_PTR,C_SIZE_T
type(C_PTR), value :: str_ptr
integer(kind = C_SIZE_T):: len
end function C_STRLEN
end interface
DO i = 1, n
! 获取 C 字符串的实际长度
strlen = C_STRLEN(strings(i))
ALLOCATE(CHARACTER(LEN=strlen) :: str)
CALL C_F_POINTER(strings(i), str)
PRINT *, "Received: ", str, len(str)
END DO
deallocate(str)
nullify(str)
END SUBROUTINE process_strings
fcode 发表于 2024-6-14 09:10
我一般都是用
type(c_ptr) , value :: cstr
character(len=n) , pointer :: fs ...
这个适合C调用Fortran
页:
[1]