c - 如何通过iso_c_binding从Fortran调用的C函数接收字符串?
问题描述
我想从 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;
}
任何人都可以提出更直接的方法吗?
解决方案
为什么不简单地使用C_CHAR
kind?我稍微“压缩”了你的代码:
program main
use, intrinsic :: iso_c_binding, only: C_INT, C_CHAR
implicit none
integer :: lw ! will contain the string length
character(256) :: w = "" ! will contain the string; Initialize to empty
! C interface
interface
subroutine getstrfromc( lw, w ) bind( c, name='getString' )
import :: C_INT, C_CHAR
implicit none
integer(C_INT), intent(out) :: lw
character(C_CHAR), intent(out) :: w(*)
end subroutine getstrfromc
end interface
! In Fortran variables are passed by default as "pointers".
call getstrfromc( lw, w )
! Write string
write (*,*) "Fortran: w: ", trim(w)
write (*,*) "Fortran: lw:", lw
end program main
C 函数保持不变。
推荐阅读
- python - 为什么元组不会改变而列表会改变?
- laravel - 从查询映射用户类型并返回响应 laravel
- bootstrap-4 - 第一课:我需要下载引导程序吗?我在哪里下载它?
- java - 在java中继承后受保护的成员会发生什么?
- javascript - 我如何在 javascript 中构造数据(使用 redux),如果逻辑发生变化,这将消耗更少的内存并且在未来很容易修改?
- javascript - 如何根据索引取消选中复选框
- objective-c - 来自值的 NSString 的 NSArray 与 NSString 的 NSArray
- json-schema-validator - 我正在使用 java 验证带有 json 模式的 json 文件,如何记录我的 json 元素与 jsonschema 不匹配?
- javascript - `for (item of array)` 和 `for (let item of array)` 之间有区别吗?
- javascript - JQuery 创建元素并在单击时执行功能