如何将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指针)将不胜感激。
问题中代码中最大的问题是您使用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] 删除。
我来说两句