【问题标题】:Arrays of strings in Fortran-C bridges using iso_c_binding使用 iso_c_binding 的 Fortran-C 桥中的字符串数组
【发布时间】:2012-03-13 14:56:44
【问题描述】:

我正在编写代码,它将使用 Fortran 的 C 互操作性机制(在 Fortran 2003 中引入并在较新版本的 gfortran 和 ifort 中实现)从 Fortran 调用 C 函数。

This answer 几乎是我所需要的,但我不知道应该在 Fortran 中为如下所示的 C 函数使用什么接口声明:

int use_array(int n, char * array[]){
    int i;
    for(i=0; i<n; i++){
        printf("Item %d = %s\n",i,array[i]);
    }
    return n;
}

我不清楚 Fortran 端接口的声明应该是什么:

interface
    function use_array(n, x) bind(C)
        use iso_c_binding
        integer (c_int) use_array
        integer (c_int), value :: n
        character(c_char) WHAT_SHOULD_GO_HERE? :: x
    end function use_array
end interface

我知道我也必须处理空终止问题。

【问题讨论】:

  • 非常感谢用户 francescalus 帮助编辑了这个问题,通过在其末尾删除“谢谢”让我显得不那么礼貌。谢天谢地,像他们这样的用户能够阻止人们用日常礼貌提出难以理解的问题。

标签: c interop fortran fortran-iso-c-binding


【解决方案1】:

我们这样做的方式是使用C_PTR 数组来指向字符串。例如:

CHARACTER(LEN=100), DIMENSION(numStrings), TARGET :: stringArray
TYPE(C_PTR), DIMENSION(numStrings) :: stringPtrs

然后我们在stringArray 中设置我们的字符串,记住以空值终止它们,例如:

DO ns = 1, numStrings
   stringArray(ns) = "My String"//C_NULL_CHAR
   stringPtrs(ns) = C_LOC(stringArray(ns))
END DO

并将stringPtrs 传递给C 函数。

C函数有接口:

void stringFunc(int *numStrings, char **stringArray) {
    int i;
    for(i=0;i<*numStrings;++i) {
       printf("%s\n",stringArray[i]);
    }
 }

【讨论】:

  • 太棒了,非常感谢您非常快速和有用的回复!为了完整起见,接口中的类型为“type(c_ptr), dimension(numStrings)”
  • 正确,在我们的代码中,我们实际上并没有为 C 函数提供接口,我们将其视为external,所以我手头没有接口块的简单示例。
  • 这不是标准的 Fortran 2003(参见第 15.2.1 节)或 2008(第 15.3.2 节): 如果类型是字符,则长度类型参数是可互操作的,当且仅当值为一。。 gfortran 将此(使用带有 C_LOC 的 character(len=...) )表示为错误。在 GCC bugzilla 中也有一个关于这个问题的 discussion
猜你喜欢
  • 2014-10-25
  • 1970-01-01
  • 2014-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
  • 2015-01-11
相关资源
最近更新 更多