最近、コードをクロスプラットフォームにするために 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)。