gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 14:58:53 26 4
gpt4 key购买 nike

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

问题 Arrays of strings in fortran-C bridges using iso_c_binding肯定是相关的,但答案似乎不正确,甚至不能用 GNU Fortran 编译。

我目前正在为 Fortran 代码开发 C 接口(interface),我希望 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 指针)将不胜感激。

最佳答案

问题中代码中最大的问题是您使用 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);
}

关于c - 将 C 字符串数组传递给 Fortran (iso_c_binding),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25610236/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com