0

最近、コードをクロスプラットフォームにするために Qt を試しました。Qt for Windows と Qt for Linux で同じコードをコンパイルしました。ただし、私のプログラムは Windows では正常に動作するようですが、Linux では (ランダムに) クラッシュします。Linuxでクラッシュする理由を理解するのは難しいです。おそらく、Windows と Linux の違いを知ることは良い出発点でしょうか? それとも、Windows に何らかのエラー防止メカニズムがあるのでしょうか?

更新:ceil()いくつかの作業の後、関数がプログラムをクラッシュさせ た結果であることがわかりました。

void setPedestriansByRealCo(int &_x,int &_y,myVector &v)
{
    int _row = 0,_colm = 0;
    boost::tuples::tie(_row,_colm) = mathOp::countRowAndColumn(_x,_y);
    setPedestriansByRowColumn(_row,_colm,v);
}

boost::tuples::tuple<int,int> countRowAndColumn(int realX,int realY)
{
    return boost::tuples::make_tuple(
                ceil((float)realY / gridWidth),
                ceil((float)realX / gridWidth)
                );
}

...

for(int i = 0; i < (int)_srcCurrentPointSet.size(); ++i) {
    int _areaRow,_areaColm;
    boost::tuples::tie(_areaRow,_areaColm) = judgePointArea(
                       _srcCurrentPointSet[i],
                       boost::tuples::make_tuple(32,24)); //use the result of countROwAndColumn
    areaPointsCurr[_areaRow * singleAreaColm + _areaColm].push_back(_srcCurrentPointSet[i]);   //<---SIGSEGV
}

の入力countRowAndColumnが (181,715) の場合、出力は_srcCurrentPointSet<18,72> になり、Linux の for ループで SIGSEGV が発生します (フィールドは 128*72)。

4

0 に答える 0