本帖最后由 weixing1531 于 2025-3-12 16:22 编辑
求助于万能的DeepSeek 我找到了答案
[C] 纯文本查看 复制代码 #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;
}
[Fortran] 纯文本查看 复制代码 ! 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[][20]
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
|