int a=0;
while (a<2)
{
//infos.stops is point to one array, called abc[10]
output = output + QString::fromStdString(*infos.stops)+ "." ;
infos.stops++;
a++;
}
ui->showMsg->setText(output);
问题是infos.stops确实显示,但一些有趣的字符显示如下:
我已经上传了我在QT Designer中设计的所有源代码 http://uploading.com/files/eaddfaf8/bus.zip/ 问题在于manager.cpp第133行。
答案 0 :(得分:3)
尝试使用
output = output + QString::fromStdString(*(infos.stops))+ "." ;
答案 1 :(得分:1)
我想我在对您的应用程序进行了一些测试后解决了这个问题。以下代码段应执行此操作:
output = output+ "Stops travelled: ";
for(int a = 0; a < infos._numstops; ++a)
{
if(a)
output += ", ";
output = output + QString::fromStdString(infos.stops[a]);
}
output = output + "<br>";
请注意,您可以使用infos._numstops
成员,并且应该使用它。如果要输出以逗号分隔的列表,if(a)
是一个很好的技巧。
(我运行了你的应用程序并注意到info
结构不包括你开始路径的停止,而是它结束的停止。你应该在输出中包含起始停止或排除目标停止。请注意,if-body中的+=
运算符是追加字符串的常用方法。)
答案 2 :(得分:0)
在manager.cpp:103中,您正在调用DE1.cost(X,Y)。此方法在堆栈(datzz.cpp:432)和datzz.cpp:502上创建std :: string数组(已传递)
c.stops = passed;
在DatzEzy :: info实例c的stops变量中存储指向堆栈上分配的内存块的指针。当方法cost(string,string)返回时,为pass传递的内存被释放,输出将是垃圾。永远不要存储指向堆栈分配对象的指针。
顺便说一下,在函数调用中传递(只读)字符串时应考虑使用const引用,这样可以避免昂贵的复制。