尽管我看到了许多类似的问题,但我找不到解决这个特殊问题的方法。
我的问题很简单,但我完全陷入困境。我有一个简单的c ++函数,为此我尝试了类似的
void function1(char* filapp) {
std::string filapp_2 = "";
fprintf(stdout, "filapp_2: %s\n", filapp_2.c_str());
filapp_2 += "A";
fprintf(stdout, "filapp_2: %s\n", filapp_2.c_str());
filapp_2 += "B";
fprintf(stdout, "filapp_2: %s\n", filapp_2.c_str());
filapp_2 += std::string(filapp);
fprintf(stdout, "filapp_2: %s\n", filapp_2.c_str());
filapp_2 += "D";
fprintf(stdout, "filapp_2: %s\n", filapp_2.c_str());
}
如果输入值为“ C”,则将打印此代码
filapp_2:
filapp_2: A
filapp_2: AB
filapp_2: ABC
filapp_2: ABC
我尝试了许多其他方法,但这基本上始终是结果。我尝试过前置,并且会删除“ AB”。我不知道为什么。
当filapp连接时,字符串不再是动态的,而是变为常量。可能与以下事实有关:通过fortran接口调用此函数会限制内存?界面看起来像
module module_name
implicit none
interface
subroutine function1 (filapp) bind(c)
use iso_c_binding
character(kind=c_char) :: filapp(*)
end subroutine function1
end interface
end module
编辑: 我被要求添加调用该函数的fortran部分。所以我正在做一个巨大的事情,所以一切都非常复杂。基本上,fortran函数看起来像
call function1(filapp)
其中filapp定义为
character(len=fnlen) :: filapp
与界面本身不同。我不确定这意味着什么。
答案 0 :(得分:1)
std::string
构造函数std::string(filapp)
要求filapp
为空终止。除非您努力做到这一点,否则Fortran中对该子例程的引用中的实际参数将不会为null终止。
考虑示例
use, intrinsic :: iso_c_binding, only : c_char, c_null_char
use module_name
call function1(c_char_'C'//c_null_char)
end
看看在没有附加c_null_char
的情况下会发生什么。
更一般地,一个变量声明为
character(len=fnlen, kind=c_char) :: filapp
作为长度为fnlen
的标量字符,可以作为参数传递给假定大小的伪参数,但是您再次需要使它以null终止:
call function1(TRIM(filapp)//c_null_char)
修剪是为了避免在终止之前留有空白。
或者,通过某种方式在filapp
中使用空字符。