【发布时间】:2017-06-07 12:32:26
【问题描述】:
我在 C++ 中有以下函数调用:
int strLength = 20;
char* name;
getName(name, strLength);
printf("name: %s\n", name);
在 Fortran 中:
subroutine getName(name) bind (c, name='GETNAME')
use,intrinsic :: iso_c_binding
implicit none
character, intent(out) :: name
name = 'Martin'
end subroutine getName
当我执行 C++ 例程时,输出为:name: M。现在,我想这是因为 character, intent(out) :: name 声明了大小为 1 的 name 变量,但是如果我将声明更改为:character(len=6), intent(out) :: name,我会收到此错误消息:Error: Character argument 'name' at (1) must be length 1 because procedure 'getname' is BIND(C)。我也试过这个:character(len=6,kind=c_char), intent(out) :: name,同样的错误信息。最后,我尝试了这个声明:character(c_char),dimension(6), intent(out) :: name,它编译但产生了这个结果:name: MMMMMM。
我的问题归结为:如何将字符串从 Fortran 返回到 C++?
【问题讨论】:
-
你为什么不实际尝试 return 它而不是传递一个指针作为参数?或者,如果您想将其作为参数传递,请确保它是通过引用完成的,否则您需要为字符串分配内存。
-
在使用了一些 google-fu 之后,我的印象是,如果你想将一个字符串从 Fortran 返回到 C++,这或多或少应该是这样做的,但显然我错过了一些东西。这不会崩溃,但是当使用我列出的
name的最后一个声明时,似乎name输出变量只填充了我分配给它的'Martin'字符串的第一个字母。 -
This question 密切相关。
-
确实如此,但据我所知,他所做的与我的示例中的几乎相同,只是他没有分配并且字符串是输入而不是输出。
-
好吧,我最初将其标记为 C/C++,但有人将其编辑为 C :P
标签: c++ fortran fortran-iso-c-binding