Fortran Coder

查看: 911|回复: 5
打印 上一主题 下一主题

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

[复制链接]

152

帖子

44

主题

1

精华

宗师

F 币
1346 元
贡献
640 点
跳转到指定楼层
楼主
发表于 2024-6-13 21:34:26 来自移动端 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
标准没有规定,有什么技巧么?
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

2035

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1657 元
贡献
711 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

沙发
发表于 2024-6-14 09:10:28 | 只看该作者
我一般都是用
[Fortran] 纯文本查看 复制代码
type(c_ptr) , value :: cstr
character(len=n) , pointer :: fstr
call c_f_pointer( cstr , fstr )

152

帖子

44

主题

1

精华

宗师

F 币
1346 元
贡献
640 点
板凳
 楼主| 发表于 2024-6-14 12:53:05 | 只看该作者
fcode 发表于 2024-6-14 09:10
我一般都是用
[mw_shl_code=fortran,true]type(c_ptr) , value :: cstr
character(len=n) , pointer :: fs ...

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

2035

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1657 元
贡献
711 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

地板
发表于 2024-6-17 16:19:04 | 只看该作者
character(c_char) :: str(*) 不好,会被当成字符数组,而不是字符串。
连 Open( 12 , File = str ) 都不行。

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

152

帖子

44

主题

1

精华

宗师

F 币
1346 元
贡献
640 点
5#
 楼主| 发表于 昨天 16:19 | 只看该作者
本帖最后由 weixing1531 于 2025-3-12 16:22 编辑
fcode 发表于 2024-6-17 16:19
character(c_char) :: str(*) 不好,会被当成字符数组,而不是字符串。
连 Open( 12 , File = str ) 都不行 ...

求助于万能的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

152

帖子

44

主题

1

精华

宗师

F 币
1346 元
贡献
640 点
6#
 楼主| 发表于 昨天 16:25 | 只看该作者
fcode 发表于 2024-6-14 09:10
我一般都是用
[mw_shl_code=fortran,true]type(c_ptr) , value :: cstr
character(len=n) , pointer :: fs ...

这个适合C调用Fortran
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2025-3-13 04:17

Powered by Tencent X3.4

© 2013-2025 Tencent

快速回复 返回顶部 返回列表