2016-12-01 18 views
-3

私は現在、C++でA * pathfindingアルゴリズムを実装しようとしています。私は私のコードを実行して、ディスプレイグリッド機能が動作しているかどうかを確認しようとしましたが、C2678エラーが発生しました:バイナリ '<': 'const Coord'タイプの左オペランドを取るオペレータが見つかりません(または、 。エラーC2678 C++ A * Pathfinding

私のプログラムは厄介で、たぶん効率的ではありませんが、私は最適化する前に基本バージョンを取得しようとしていました。私はCoord構造体のブール値を出力しようとしているのでエラーですか?

コード:

#include <iostream> 
#include <fstream> 
#include <chrono> 
#include <thread> 
#include <vector> 
#include <set> 

using std::chrono::milliseconds; 
using std::chrono::duration_cast; 
using std::this_thread::sleep_for; 

typedef std::chrono::steady_clock the_clock; 

struct Location { 
    int g = 0; // Distance covered so far 
    int h = 0; // Estimate of distance to goal 
    float f = 0; // Estimated cost of the complete path 
    bool walkable = 0; // 0 = Walkable, 1 = Wall 
}; 

// Structure 
struct Coord { 
    int x; 
    int y; 
    Location location; 
}; 

// Declare size of grid 
#define WIDTH 10 
#define HEIGHT 10 

typedef Location Array[HEIGHT][WIDTH]; 
Location grid[HEIGHT][WIDTH]; // Create an array of locations 

void displayGrid() { 
    /* Displays the Grid to the console! */ 
    system("CLS"); 
    for (int y = 0; y < HEIGHT; y++) { 
     for (int x = 0; x < WIDTH; x++) { 
      std::cout << grid[y][x].walkable; 
     } 
     std::cout << "\n"; 
    } 
    sleep_for(milliseconds(100)); // Visual delay 
} 

void initialiseGrid() { 
    /* Fills the Grid array with values */ 
    srand((unsigned)time(0)); 

    for (int y = 0; y < HEIGHT; y++) { 
     for (int x = 0; x < WIDTH; x++) { 
      grid[y][x].walkable = 0; 
    } 
} 

/* Test grid */ 
grid[4][2].walkable = 1; 
grid[5][2].walkable = 1; 
grid[4][3].walkable = 1; 
grid[5][3].walkable = 1; 
grid[4][5].walkable = 1; 
grid[5][5].walkable = 1; 
grid[4][6].walkable = 1; 
grid[5][6].walkable = 1; 
} 

void Astar(Coord startPoint, Coord endPoint) { 
    /**/ 
    std::set<Coord> closedSet = {}; // Nodes that do not have to be considered again 
    std::set<Coord> openSet = {}; // Nodes still to be considered to find the shortest path 

    Coord currentNode; // Current node 
    currentNode.x = startPoint.x; 
    currentNode.y = startPoint.y; 
    currentNode.location.g = 0; // 0 Distance from starting point 

    openSet.insert(currentNode); // Insert starting node 

    while (openSet.empty() == false) { // Loop while open list is not empty 

     for (std::set<Coord>::iterator it = openSet.begin(); it != openSet.end(); it++) { // Iterate through each element in the open set to find the lowest F value 
      if ((*it).location.f < currentNode.location.f) { // Check if iterator f value is smaller than the current value 
       currentNode = *it; // Update the current node 
      } 
     } 

     openSet.erase(currentNode); // Drop from the open set since been checked 
     closedSet.insert(currentNode); // Add to the closed set 
    } 
} 


int main(int argc, char *argv[]) { 
    // Set start and end points 
    Coord start; 
    start.x = 3; 
    start.y = 3; 
    Coord end; 
    end.x = 5; 
    end.y = 6; 

    initialiseGrid(); // Put -1 (empty) in 

    // Start timing 
    the_clock::time_point startTime = the_clock::now(); 

    // Stop timing 
    the_clock::time_point endTime = the_clock::now(); 

    // Compute the difference between the two times in milliseconds 
    auto time_taken = duration_cast<milliseconds>(endTime - startTime).count(); 

    displayGrid(); 

    std::cout << "That took: " << time_taken << " ms" << std::endl; 

    return 0; 
} 
+2

[mcve]を提供するために質問を編集してください。 –

+0

提供したコードにoperator <の実装が表示されません。 – drescherjm

+3

['std :: set'](http://www.cplusplus.com/reference/set/set/)には厳密な弱い順序を持つ要素が必要です*。 'Coord'構造体は順序付け演算を提供しません(' std :: less'、 'operator <()'の特殊化はありません)。したがって 'std :: set'は' Coord'オブジェクトとcroakをどのように比較するのか分かりません。 – dhke

答えて

0

厳格な弱発注し、あなたのCoordクラスを必要とstd::setの問題を解決する最も簡単な方法は、operator <Coordxy値を比較し、かどうかを返す提供することです1つのCoordは、これらの値を使用する別のCoordより小さい。

あなたが等しくならば、yコンポーネントを比較し、std::tie

#include <tuple> 
//... 
struct Coord { 
    int x; 
    int y; 
    Location location; 
    bool operator <(const Coord& c) const 

    // returns true if this->x and this->y < c.x and c.y, false otherwise 
    { return std::tie(x,y) < std::tie(c.x,c.y); } 
}; 

std::tiexコンポーネントを比較してこれを行うことができます。比較の結果が返されます(x、yコンポーネントの最初のセットがx、yコンポーネントの2番目のセットより小さい場合はtrue、それ以外の場合はfalse)。

Live Example here

+0

ご協力いただきありがとうございます。ポールは、今のところ期待どおりに動作しています。これは私の最初の厳しい - 弱い順序を扱っていたので、何が起こっていたかの手がかりを持っていませんでした。感謝します! –

関連する問題