我想從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++,所以我並不反對這兩種標籤,但許多其他人都是。 –
這兩個版本都無法工作。子例程退出時,本地可分配字符串將被釋放。局部變量僅在執行期間在堆棧上有效。 –