【发布时间】:2019-12-09 10:47:25
【问题描述】:
我想从 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;
}
谁能提出更直接的方法?
【问题讨论】:
-
您知道
character(len=200) a的实际实参可以是与character(len=1) b(*)(或b(200))哑元关联的实参吗? -
@francescalus 我需要 d1 成为“目标”。我尝试将它用作虚拟参数,编译器说我需要子程序 strfromc 的显式接口
-
是的,如果您有带有目标虚拟参数的
strfromc,您将需要该子例程来拥有主程序的显式接口。如果你给它一个(比如把strfromc放在一个使用的模块中),那么它会起作用吗? -
是的,确实如此,谢谢!我在“答案”中发布了我的新代码。
标签: c string fortran fortran-iso-c-binding