weixing1531 发表于 2024-6-13 21:34:26

C混合编程时char *str []对应的Fortran形参是什么

标准没有规定,有什么技巧么?

fcode 发表于 2024-6-14 09:10:28

我一般都是用
type(c_ptr) , value :: cstr
character(len=n) , pointer :: fstr
call c_f_pointer( cstr , fstr )

weixing1531 发表于 2024-6-14 12:53:05

fcode 发表于 2024-6-14 09:10
我一般都是用
type(c_ptr) , value :: cstr
character(len=n) , pointer :: fs ...

你这个是对应char str []吧?
character(c_char) :: str(*)
这个我会

fcode 发表于 2024-6-17 16:19:04

character(c_char) :: str(*) 不好,会被当成字符数组,而不是字符串。
连 Open( 12 , File = str ) 都不行。

char *str [] 这种是指向 char * 的数组吗?那只能定义一个结构体了,用结构体数组。结构体成员又是 type(c_ptr)

weixing1531 发表于 2025-3-12 16:19:08

本帖最后由 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

weixing1531 发表于 2025-3-12 16:25:12

fcode 发表于 2024-6-14 09:10
我一般都是用
type(c_ptr) , value :: cstr
character(len=n) , pointer :: fs ...

这个适合C调用Fortran
页: [1]
查看完整版本: C混合编程时char *str []对应的Fortran形参是什么