我想从Fortran传递一个字符串到C/C++。这里是我的Fortran代码:将字符串从Fortran传递到C/C++的正确方法
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++,所以我并不反对这两种标签,但许多其他人都是。 –
这两个版本都无法工作。子例程退出时,本地可分配字符串将被释放。局部变量仅在执行期间在堆栈上有效。 –