【发布时间】:2017-07-26 14:49:20
【问题描述】:
我想将一个字符串从 Fortran 传递到 C/C++。这是我的 Fortran 代码:
subroutine zdplaskinGetSpeciesName(cstring, index) bind(C, name='zdplaskinGetSpeciesName')
use iso_c_binding
use ZDPlasKin
implicit none
integer, intent(in) :: index
CHARACTER(10), TARGET :: fstring = ''
TYPE(C_PTR) :: cstring
fstring = species_name(index+1)
cstring = c_loc(fstring)
end subroutine zdplaskinGetSpeciesName
ZDPlasKin 是一个具有species_name(i) 的模块。
extern "C" void zdplaskinGetSpeciesName(char* cstring[], size_t* index);
char* cstring[1];
size_t index = 1;
zdplaskinGetSpeciesName(cstring, &index);
string speciesName = string(cstring[0]);
cout << speciesName << endl;
这种方法的输出似乎很好。但是,我想修剪尾随空格(character(10)提供额外的空间),所以我的 C++ 代码可以正确读取字符串。我尝试了另一种方法。
subroutine zdplaskinGetSpeciesName(cstring, index) bind(C, name='zdplaskinGetSpeciesName')
use iso_c_binding
use ZDPlasKin
implicit none
integer, intent(in) :: index
CHARACTER(:), allocatable, TARGET :: fstring
TYPE(C_PTR) :: cstring
fstring = trim(species_name(index+1))
cstring = c_loc(fstring)
end subroutine zdplaskinGetSpeciesName
但是这样我得到了一些奇怪的符号。
我想正确地做事,所以以后不用担心。内存泄漏不是我想要的。所以我想我会尝试你建议的替代方式。我想我想知道我怎么知道我是否需要释放一个指针。这是我在 StackOverflow 上找到的另一个代码(虽然这个将 C++ 字符串传递给 Fortran。https://stackoverflow.com/a/30430656/721644)
你觉得这个可以用吗?或者可能存在内存泄漏。你也能给我一些关于你建议的替代方式的提示吗?
【问题讨论】:
-
但是这样我得到了一些奇怪的符号。你得到了什么?
-
请注意,没有 C/C++ 语言,这里的一些使用 C 和 C++ 的人对此非常过敏。 Fortranners通常不在乎。我知道它是通过 C 互操作性在 C++ 中调用的,所以我不反对这两个标签,但很多其他人都反对。
-
这两个版本都无法正常工作。当子例程退出时,本地可分配字符串将被释放。局部变量只在执行期间在栈上有效。
-
您链接的代码可能是正确的,但它还有其他作用。正如我所说,你可以在 StackOverflow 上找到很多有用的东西,但你可能不应该把它们都带到这里。
标签: c++ string fortran fortran-iso-c-binding