如何通过 iso_c_binding 从 Fortran 调用的 C 函数接收字符串?

2023-12-06

我想从 Fortran 调用 C 函数并接收 C 函数中定义的字符串。我进行了搜索,但到目前为止我找不到有效的、直接的答案。

实际上我找到了一个解决方法:接收字符数组,然后使用内部函数transfer将结果放入 Fortran 字符串中。 这是我的工作代码。

Fortran主程序:

program pr
    implicit none
    character(200) :: stringa

    call strfromc(stringa)
    write (6,*) 'FPR stringa: "', trim(stringa),'"'

    stop
end program pr

Fortran 子程序:

subroutine strfromc(stringa)
    use iso_c_binding
    implicit none

    character(200) :: stringa

    interface
        subroutine getstrfromc(ld,d) bind(c,name='getString')
            import :: c_int, c_ptr
            integer(c_int) :: ld
            type(c_ptr), value :: d
        end subroutine getstrfromc
    end interface

    ! declare a character array of type c_char and sufficient length:
    character(c_char), dimension(200), target :: d1

    integer :: ld1 ! will contain the string length
    integer :: i

    ! the C pointer of character array d1 is passed:
    call getstrfromc(ld1, c_loc(d1))

    ! read the first ld1 elements of array d1 as a character string, which will be returned:
    stringa= transfer(d1(1:ld1), stringa)

    write (6,*) 'SF d1: ', (d1(i),i=1,ld1)
    write (6,*) 'SF stringa: "', trim(stringa),'"'
    write (6,*) ''

    return
end subroutine

C函数:

#include <stdio.h>
#include <string.h>

void getString(int * lw, char * w) {
    printf("Enter a string:\n");
    scanf("%[^\n]", w); //scanning the whole string, including the white spaces

    *lw= strlen(w);

    printf("C: w: %s\n", w);
    printf("C: lw: %d\n", *lw);
    printf("\n");

    return;
}

谁能建议一个更直接的方法?


为什么不简单地使用C_CHAR种类?我“压缩”了你的代码:

program main
  use, intrinsic :: iso_c_binding, only: C_INT, C_CHAR
  implicit none
  integer         :: lw ! will contain the string length
  character(256)  :: w = "" ! will contain the string; Initialize to empty

  ! C interface
  interface
    subroutine getstrfromc( lw, w ) bind( c, name='getString' )
      import :: C_INT, C_CHAR
      implicit none
      integer(C_INT), intent(out)     :: lw
      character(C_CHAR), intent(out)  :: w(*)
    end subroutine getstrfromc
  end interface

  ! In Fortran variables are passed by default as "pointers".
  call getstrfromc( lw, w )

  ! Write string
  write (*,*) "Fortran: w: ", trim(w)
  write (*,*) "Fortran: lw:", lw

end program main

C 函数保持不变。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何通过 iso_c_binding 从 Fortran 调用的 C 函数接收字符串? 的相关文章

  • 如何在 VC++ CString 中验证有效的整数和浮点数

    有人可以告诉我一种有效的方法来验证 CString 对象中存在的数字是有效整数还是浮点数吗 Use tcstol http msdn microsoft com en us library w4z2wdyc aspx and tcstod
  • C# 方法重载决策不选择具体的泛型覆盖

    这个完整的 C 程序说明了这个问题 public abstract class Executor
  • Grpc - 将消息从一个客户端发送到连接到同一服务器的另一个客户端

    是否可以将消息从一个客户端发送到连接到同一服务器的另一个客户端 我想将数据从一个客户端发送到服务器然后发送到特定客户端 我想我需要获取客户端 ID 但我不知道如何获取此 ID 以及如何从服务器将此消息发送到该客户端 我这里有一个样本 这是一
  • 转换 const void*

    我有一个函数返回一个const void 我想用它的信息作为char 我可以将它投射为 C 风格的罚款 char variable但是当我尝试使用reinterpret cast like reinterpret cast
  • 前向声明类型和“已声明为类类型的非类类型”

    我对以下代码有问题 template
  • MVC3中设置下拉列表中的所选项目

    我必须为视图中的下拉列表设置所选项目 但它不起作用 View div class editor label Html LabelFor model gt model Gender div div class editor field Htm
  • 未找到 Boost 库,但编译正常

    我正在尝试在 C 中使用 boost 的文件系统 使用时看起来编译没问题 c c Analyse c o Analyse o g W Wall L usr local lib lboost filesystem lboost system
  • java中如何重新初始化int数组

    class PassingRefByVal static void Change int pArray pArray 0 888 This change affects the original element pArray new int
  • 有些有助于理解“产量”

    在我不断追求少吸的过程中 我试图理解 产量 的说法 但我不断遇到同样的错误 someMethod 的主体不能是迭代器块 因为 System Collections Generic List 不是迭代器接口类型 这是我被卡住的代码 forea
  • 强制初始化模板类的静态数据成员

    关于模板类的静态数据成员未初始化存在一些问题 不幸的是 这些都没有能够帮助我解决我的具体问题的答案 我有一个模板类 它有一个静态数据成员 必须为特定类型显式实例化 即必须专门化 如果不是这种情况 使用不同的模板函数应该会导致链接器错误 这是
  • 如何在 C# Designer.cs 代码中使用常量字符串?

    如何在 designer cs 文件中引用常量字符串 一个直接的答案是在我的 cs 文件中创建一个私有字符串变量 然后编辑 Designer cs 文件以使用此变量 而不是对字符串进行硬编码 但设计者不喜欢这样抛出错误 我明白为什么这行不通
  • 检查字符串是否编码为 UTF-8

    function seems utf8 str length strlen str for i 0 i lt length i c ord str i if c lt 0x80 n 0 0bbbbbbb elseif c 0xE0 0xC0
  • 是否使用 C# 数据集? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我对 C 中的数据集概念有点困惑 编码 ASP NET 站点 但这并不重要 在我的阅读中 我了解到它们 本质上 用作我的应用程序和我的
  • 已发布的 .Net Core 应用程序警告安装 .Net Core,但它已安装

    我制作了一个 WPF 和控制台应用程序 供某人在我无法访问的私人服务器上使用 我使用 Visual Studio 2019 的内置 发布向导 来创建依赖于框架的单文件应用程序 当该人打开 WPF 应用程序时 他们会看到标准警告 他们单击 是
  • 如果输入被重定向则执行操作

    我想知道如果我的输入被重定向 我应该如何在 C 程序中执行操作 例如 假设我有已编译的程序 prog 并且我将输入 input txt 重定向到它 我这样做 prog lt input txt 我如何在代码中检测到这一点 一般来说 您无法判
  • 使动态创建的链接标签在 Winforms 中可点击

    我正在制作一个程序 允许用户单击由动态链接标签创建的公司名称 在我想知道如何做到这一点之前 我从未在 C 中使用过链接标签 可为特定用户生成的业务数量各不相同 因此每个用户的链接标签数量并不相同 然后我想捕获业务 ID 以进行 Json 调
  • 将 Lambda 表达式树与 IEnumerable 结合使用

    我一直在尝试了解有关使用 Lamba 表达式树的更多信息 因此我创建了一个简单的示例 这是代码 如果作为 C 程序粘贴到 LINQPad 中 它可以工作 void Main IEnumerable
  • 代码中的.net Access Forms身份验证“超时”值

    我正在向我的应用程序添加注销过期警报 并希望从我的代码访问我的 web config 表单身份验证 超时 值 我有什么办法可以做到这一点吗 我认为您可以从 FormsAuthentication 静态类方法中读取它 这比直接读取 web c
  • 如何缩短 PHP if 语句?

    我有一个 if 语句 我需要将单个字符串与许多不同的选项进行比较 我在下面发布的代码非常清楚地表明了我的意思 我知道有两种方法可以做到这一点 但另一种甚至更长 那么 是否有任何函数可以以更短的方式实现类似的功能 我的要求可能看起来很愚蠢 但
  • 在 System.Type 上使用条件断点时出错

    这是函数 public void Init System Type Type this Type Type BuildFieldAttributes BuildDataColumns FieldAttributes 我在第一行设置了一个断点

随机推荐