私はVS2015でDirectX11アプリケーションを開発中です。最近、このmsvcp140d.dllライブラリによって発生したランタイムエラーが発生しました。 どのようにmsvcp140d.dllが整数比較にエラーを引き起こす可能性がありますか?
してエラーを生成するコードを以下に示します:エラーが発生したコールスタックは以下のとおりです私の知る限りは、変数の値を言うことができるよう![enter image description here](https://i.stack.imgur.com/VdYEo.jpg)
は許容できるものであったので、私は思いますこのコード行でmsvcp140d.dllが壊れた原因を正確に把握できません。このdllが間違っている可能性がありますか?あるいは何かが間違っている?
エラーのある関数は、私のA *アルゴリズムの実装です。
vector<pair<int, int>> NavigationManager::pathFinding(int startX, int startY, int endX, int endY) const{
vector<pair<int, int>> path;
if (startX == endX&&startY == endY)
return path;
Node ***nodeMap = new Node**[mapHeight];
for (int i = 0; i<mapHeight; ++i)
{
nodeMap[i] = new Node*[mapWidth];
for (int j = 0; j<mapWidth; ++j)
{
if (map[i][j] != 1) {
nodeMap[i][j] = new Node(j, i);
nodeMap[i][j]->hValue = (abs(endX - j) + abs(endY - i)) * 10;
}
else
nodeMap[i][j] = nullptr;
}
}
auto comp = [](Node *a, Node *b) {return (a->gValue + a->hValue) > (b->gValue + a->hValue); };
priority_queue<Node*, vector<Node*>, decltype(comp)> pq(comp);
vector<Node*> v;
int currentX, currentY, currentGValue;
Node *currentParent = nullptr;
do
{
if (pq.empty())
{
currentX = startX;
currentY = startY;
currentGValue = 0;
}
else
{
currentParent = pq.top();
currentX = currentParent->x;
currentY = currentParent->y;
currentGValue = currentParent->gValue;
v.push_back(currentParent);
pq.pop();
}
if (currentX == endX&¤tY == endY)
break;
if (currentX<mapWidth - 1 && map[currentY][currentX + 1] != 1)
{
if (nodeMap[currentY][currentX + 1]->gValue == 0)
{
nodeMap[currentY][currentX + 1]->gValue = currentGValue + 10;
nodeMap[currentY][currentX + 1]->parent = currentParent;
pq.push(nodeMap[currentY][currentX + 1]);
}
else if (currentGValue + 10<nodeMap[currentY][currentX + 1]->gValue)
{
nodeMap[currentY][currentX + 1]->gValue = currentGValue + 10;
nodeMap[currentY][currentX + 1]->parent = currentParent;
}
}
if (currentX<mapWidth - 1 && map[currentY][currentX + 1] != 1 && currentY<mapHeight - 1 && map[currentY + 1][currentX] != 1 && map[currentY + 1][currentX + 1] != 1)
{
if (nodeMap[currentY + 1][currentX + 1]->gValue == 0)
{
nodeMap[currentY + 1][currentX + 1]->gValue = currentGValue + 14;
nodeMap[currentY + 1][currentX + 1]->parent = currentParent;
pq.push(nodeMap[currentY + 1][currentX + 1]);
}
else if (currentGValue + 14<nodeMap[currentY + 1][currentX + 1]->gValue)
{
nodeMap[currentY + 1][currentX + 1]->gValue = currentGValue + 14;
nodeMap[currentY + 1][currentX + 1]->parent = currentParent;
}
}
if (currentY<mapHeight - 1 && map[currentY + 1][currentX] != 1)
{
if (nodeMap[currentY + 1][currentX]->gValue == 0)
{
nodeMap[currentY + 1][currentX]->gValue = currentGValue + 10;
nodeMap[currentY + 1][currentX]->parent = currentParent;
pq.push(nodeMap[currentY + 1][currentX]);
}
else if (currentGValue + 10<nodeMap[currentY + 1][currentX]->gValue)
{
nodeMap[currentY + 1][currentX]->gValue = currentGValue + 10;
nodeMap[currentY + 1][currentX]->parent = currentParent;
}
}
if (currentX>0 && map[currentY][currentX - 1] != 1 && currentY<mapHeight - 1 && map[currentY + 1][currentX] != 1 && map[currentY + 1][currentX - 1] != 1)
{
if (nodeMap[currentY + 1][currentX - 1]->gValue == 0)
{
nodeMap[currentY + 1][currentX - 1]->gValue = currentGValue + 14;
nodeMap[currentY + 1][currentX - 1]->parent = currentParent;
pq.push(nodeMap[currentY + 1][currentX - 1]);
}
else if (currentGValue + 14<nodeMap[currentY + 1][currentX - 1]->gValue)
{
nodeMap[currentY + 1][currentX - 1]->gValue = currentGValue + 14;
nodeMap[currentY + 1][currentX - 1]->parent = currentParent;
}
}
if (currentX>0 && map[currentY][currentX - 1] != 1)
{
if (nodeMap[currentY][currentX - 1]->gValue == 0)
{
nodeMap[currentY][currentX - 1]->gValue = currentGValue + 10;
nodeMap[currentY][currentX - 1]->parent = currentParent;
pq.push(nodeMap[currentY][currentX - 1]);
}
else if (currentGValue + 10<nodeMap[currentY][currentX - 1]->gValue)
{
nodeMap[currentY][currentX - 1]->gValue = currentGValue + 10;
nodeMap[currentY][currentX - 1]->parent = currentParent;
}
}
if (currentX>0 && map[currentY][currentX - 1] != 1 && currentY>0 && map[currentY - 1][currentX] != 1 && map[currentY - 1][currentX - 1] != 1)
{
if (nodeMap[currentY - 1][currentX - 1]->gValue == 0)
{
nodeMap[currentY - 1][currentX - 1]->gValue = currentGValue + 14;
nodeMap[currentY - 1][currentX - 1]->parent = currentParent;
pq.push(nodeMap[currentY - 1][currentX - 1]);
}
else if (currentGValue + 14<nodeMap[currentY - 1][currentX - 1]->gValue)
{
nodeMap[currentY - 1][currentX - 1]->gValue = currentGValue + 14;
nodeMap[currentY - 1][currentX - 1]->parent = currentParent;
}
}
if (currentY>0 && map[currentY - 1][currentX] != 1)
{
if (nodeMap[currentY - 1][currentX]->gValue == 0)
{
nodeMap[currentY - 1][currentX]->gValue = currentGValue + 10;
nodeMap[currentY - 1][currentX]->parent = currentParent;
pq.push(nodeMap[currentY - 1][currentX]);
}
else if (currentGValue + 10<nodeMap[currentY - 1][currentX]->gValue)
{
nodeMap[currentY - 1][currentX]->gValue = currentGValue + 10;
nodeMap[currentY - 1][currentX]->parent = currentParent;
}
}
if (currentX<mapWidth - 1 && map[currentY][currentX + 1] != 1 && currentY>0 && map[currentY - 1][currentX] != 1 && map[currentY - 1][currentX + 1] != 1)
{
if (nodeMap[currentY - 1][currentX + 1]->gValue == 0)
{
nodeMap[currentY - 1][currentX + 1]->gValue = currentGValue + 14;
nodeMap[currentY - 1][currentX + 1]->parent = currentParent;
pq.push(nodeMap[currentY - 1][currentX + 1]);
}
else if (currentGValue + 14<nodeMap[currentY - 1][currentX + 1]->gValue)
{
nodeMap[currentY - 1][currentX + 1]->gValue = currentGValue + 14;
nodeMap[currentY - 1][currentX + 1]->parent = currentParent;
}
}
} while (!pq.empty());
if (v.size() == 0 || v[v.size() - 1]->x != endX || v[v.size() - 1]->y != endY)
return path;
stack<pair<int, int>> s;
if (!v.empty())
{
Node *destination = v[v.size() - 1];
while (destination)
{
s.push(pair<int, int>(destination->x, destination->y));
destination = destination->parent;
}
}
while (!s.empty())
{
path.push_back(s.top());
s.pop();
}
for (int i = 0; i<mapHeight; ++i)
{
for (int j = 0; j<mapWidth; ++j)
{
delete nodeMap[i][j];
}
delete[] nodeMap[i];
}
delete[] nodeMap;
return path;
}
このライブラリはC++ランタイムライブラリであり、問題はほとんどありません。あなた自身のコードで問題を探します。 – SergeyA
Line 81は、呼び出された関数が返されたときにこの関数の実行が再開する場所です。可能であれば 'pq.pop();'コードをスクリーンショットではなくコードとして投稿します。 – 1201ProgramAlarm