将C字符串数组传递给Fortran(iso_c_binding)

亚历克斯

如何将C字符串数组(char* cstrings[])传递给Fortran子例程?

问题使用iso_c_binding的fortran-C桥中的字符串数组肯定是相关的,但是答案似乎并不正确,甚至无法使用GNU Fortran进行编译。

我目前正在为Fortran代码开发C接口,并且我希望iso_c_binding(我以前使用过)会很轻松。到目前为止,对于C字符串数组来说还没有运气...

Fortran子例程应将字符串数组作为参数。在简单的Fortran中,我将编写以下内容:

subroutine print_fstring_array(fstring)

  implicit none

  character(len=*), dimension(:), intent(in) :: fstring
  integer                                    :: i

  do i = 1, size(fstring)
    write(*,*) trim(fstring(i))
  end do

end subroutine print_fstring_array

将单个C字符串传递给Fortran的一种方法是使用C指针(c_ptr)(我知道,我也可以使用的数组character(kind=c_char)

subroutine print_cstring(cstring) bind(C)

  use iso_c_binding, only: c_ptr, c_f_pointer, c_loc, c_null_char
  implicit none

  type(c_ptr), target, intent(in) :: cstring
  character(len=1024), pointer    :: fstring
  integer                         :: slen

  call c_f_pointer(c_loc(cstring), fstring)
  slen = index(fstring, c_null_char) - 1
  write(*,*) fstring(1:slen)

end subroutine print_cstring

因此,我认为c_ptr最好将

subroutine print_cstring_array(n, cstring) bind(C)

  use iso_c_binding, only: c_ptr, c_int, c_f_pointer, c_loc, c_null_char
  implicit none

  integer(kind=c_int),               intent(in) :: n
  type(c_ptr), dimension(n), target, intent(in) :: cstring
  character(len=1024), pointer                  :: fstr
  integer                                       :: slen, i

  do i = 1, n
    call c_f_pointer(c_loc(cstring(i)), fstring)
    slen = index(fstring, c_null_char) - 1
    write(*,*) fstring(1:slen)
  end do

end subroutine print_cstring_array

但这会产生分段错误。

最后一个示例的C代码是

# include "stdio.h"
# include "fstring.h"

void main(void) {
  char* cstring[] = { "abc", "def", "ghi", "jkl" };
  int n = 4;
  print_cstring_array(&n, cstring);
}

头文件的内容fstring.h很简单:

void print_cstring_array(int* n, char* cstring[]);

我的目标是GNU Fortran和Intel Fortran,并已使用GNU Fortran测试了以上内容。字符串长度是固定的(在上面的示例中为3),以防简化。但是,阵列的尺寸可以变化。

任何指针(甚至是C指针)将不胜感激。

弗拉基米尔F

问题中代码中最大的问题是您使用c_f_pointer(c_loc(cstring),而不是c_f_pointer(cstring,

这对我有用:

subroutine print_cstring_array(n, cstring) bind(C)

  use iso_c_binding, only: c_ptr, c_int, c_f_pointer, c_loc, c_null_char
  implicit none

  integer(kind=c_int),               intent(in) :: n
  type(c_ptr), dimension(n), target, intent(in) :: cstring
  character, pointer                            :: fstring(:)
  integer                                       :: slen, i

  do i = 1, n
    call c_f_pointer(cstring(i), fstring, [4])
    write(*,*) fstring
  end do

end subroutine print_cstring_array



# include "stdio.h"

void print_cstring_array(int* n, char* cstring[]);

void main(void) {
  char* cstring[] = { "abc", "def", "ghi", "jkl" };
  int n = 4;
  print_cstring_array(&n, cstring);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

通过ISO_C_BINDING传递Fortran数组

来自分类Dev

通过ISO_C_BINDING传递Fortran数组

来自分类Dev

将C#字符串数组传递给C ++

来自分类Dev

将字符串数组传递给C中的函数

来自分类Dev

C ++将字符串数组传递给函数

来自分类Dev

ISO_C_BINDING从Fortran调用C例程(具有双精度和数组)

来自分类Dev

使用cmake将C ++和FORTRAN(mpif90)与iso_c_binding耦合

来自分类Dev

如何将多个Fortran字符串传递给C?

来自分类Dev

如何将字符串数组指针传递给新的字符数组?在 C

来自分类Dev

将字符串作为c_ubyte数组传递给C

来自分类Dev

将字符串作为c_ubyte数组传递给C

来自分类Dev

将字符串从Fortran dll传递到C#

来自分类Dev

将字符串从 Fortran 传递到 C++

来自分类Dev

如何使用f2py将字符串数组传递给Fortran子例程

来自分类Dev

使用Swig将numpy字符串数组传递给C

来自分类Dev

如何将Swift字符串数组传递给带有char **参数的C函数

来自分类Dev

通过jQuery AJAX将字符串数组传递给C#WebMethod

来自分类Dev

C ++:在不使用向量的情况下将字符串数组传递给函数

来自分类Dev

c#将多行字符串传递给函数并返回数组

来自分类Dev

使用Swig将numpy字符串数组传递给C

来自分类Dev

LuaJIT ffi:如何将字符串数组传递给c函数

来自分类Dev

将字符串文字传递给C

来自分类Dev

C结构;克服将字符串传递给char

来自分类Dev

将C ++字符串传递给ac#函数

来自分类Dev

将指针(字符串)传递给C函数

来自分类Dev

C 将字符串传递给函数问题

来自分类Dev

将swift字符串传递给c函数char *

来自分类Dev

为什么选择ISO_C_BINDING

来自分类Dev

ISO_C_BINDING:对性能/优化的影响

Related 相关文章

热门标签

归档