-2
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が表示されたことですが、いくつかの面白いキャラクターは次のように表示されます。

ここに画像の説明を入力してください

QTDesignerhttp: //uploading.com/files/eaddfaf8/bus.zip/で設計されたすべてのソースコードをアップロードし ました。問題の行はmanager.cpp行133にあります。

4

3 に答える 3

3

使ってみてください output = output + QString::fromStdString(*(infos.stops))+ "." ;

于 2011-01-30T15:57:00.777 に答える
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._numstopsif(a)カンマ区切りのリストを出力する場合は、これが便利なトリックです。

(アプリケーションを実行したところ、構造体にパスを開始するストップが含まれておらず、パスが終了するストップが含まれていることに気付きinfoました。出力に開始ストップを含めるか、ターゲットストップを除外する必要があります+=。 if-bodyは、文字列を追加する一般的な方法です。)

于 2011-02-01T18:52:50.073 に答える
0

manager.cpp:103では、DE1.cost(X、Y)を呼び出しています。このメソッドは、スタック(datzz.cpp:432)にstd :: string配列(渡された)を作成し、datzz.cpp:502で作成します。

c.stops = passed;

これは、スタックに割り当てられたメモリブロックへのポインタをDatzEzy::infoインスタンスのstops変数に格納します。メソッドcost(string、string)が戻ると、渡されたために割り当てられたメモリが解放され、出力はガベージになります。割り当てられたオブジェクトをスタックするためのポインタは絶対に保存しないでください。

ちなみに、関数呼び出しで(読み取り専用の)文字列を渡すときは、const参照の使用を検討する必要があります。これにより、コストのかかるコピーを回避できます。

于 2011-02-01T17:16:49.210 に答える