- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Eclpise CDT 在 C++ 中开发 A* 搜索,我的搜索工作正常,它在 Eclispe 中将预期结果打印到终端。
我遇到的问题是,如果我尝试从命令行 (Ubuntu 13.10) 编译/运行,我会收到相当多的编译错误,这些错误几乎会提示程序中的每个函数或参数。
代码我会把它全部贴出来,以防有人想尝试模拟这个错误:
主要.cpp
#include <iostream>
#include <ostream>
#include <vector>
#include <queue>
#include <stdlib.h>
#include <math.h>
#include <cmath>
#include <list>
#include "Node.h"
#include "main.h"
int main(){
int map[20][20] = {{0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,2},
{0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0},
{0,0,0,0,0,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0},
{0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,1,0,0,0},
{0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,1,0,0,0},
{0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,1,0,0,0},
{0,0,3,0,0,1,1,1,1,1,1,1,0,0,0,0,1,0,0,0},
{0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,1,1,0,0,0},
{0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0},
{0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0},
{0,0,0,1,1,1,1,1,1,1,0,0,0,1,0,0,0,0,0,0},
{0,0,0,1,1,1,1,1,1,1,0,0,0,1,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0}};
using namespace std;
list<Node*> openList;
vector<Node*> closedList;
Node *end;
Node *start = initiateStart(map);
openList.push_front(start);
cout <<"Start index: x " << start->getX() << " y " <<start->getY() << endl;
while (!openList.empty()) {
Node *best = openList.front();
openList.pop_front();
if(!checkInClosedList(closedList, best->getX(), best->getY())){
calcManhattanDistance(best, map);
if(best->getValue() == 3){
end = best;
cout <<"end index: x " << end->getX() << " y " <<end->getY() << endl;
checkPath(end, map);
for (std::list<Node*>::iterator iter = openList.begin(); iter != openList.end(); ++iter) {
(*iter)-> ~Node();
}
exit(1);
}
if(map[best->getX()][best->getY()-1] != 1 && best->getY() - 1 > -1){
if(placeInOpen(openList,best->getX(), best->getY() - 1)){
openList.push_front(generateLeftChild(best, map));
}
}
//to the right
if(map[best->getX()][best->getY()+1] != 1 && best->getY() + 1 < 20){
if(placeInOpen(openList,best->getX(), best->getY() + 1)){
openList.push_front(generateRightChild(best, map));
}
}
//above
if(map[best->getX()-1][best->getY()] != 1 && best->getX() - 1 > -1){
if(placeInOpen(openList,best->getX()-1, best->getY())){
openList.push_front(generateAboveChild(best, map));
}
}
//below
if(map[best->getX()+1][best->getY()] != 1 && best->getX() + 1 < 20){
if(placeInOpen(openList,best->getX()+1, best->getY())){
openList.push_front(generateBelowChild(best, map));
}
}
closedList.push_back(best);
}
openList.sort(NodeComparator());
}
return 0;
}
Node* initiateStart(int m[20][20]){
Node *start;
for(int i = 0; i < 20; i++){
for(int j = 0; j < 20; j++){
if(m[i][j] == 2){
start = new Node(i, j, m[i][j], 0, NULL);
}
}
}
return start;
}
Node* generateLeftChild(Node *parent, int m[20][20]){
Node *child;
child = new Node(parent->getX(), parent->getY() - 1, m[parent->getX()][parent->getY() - 1],
parent->getGCost() + 1, parent);
calcManhattanDistance(child, m);
return child;
}
Node* generateRightChild(Node *parent, int m[20][20]){
Node *child;
child = new Node(parent->getX() , parent->getY() + 1, m[parent->getX()][parent->getY() + 1],
parent->getGCost() + 1, parent);
calcManhattanDistance(child, m);
return child;
}
Node* generateAboveChild(Node *parent, int m[20][20]){
Node *child;
child = new Node(parent->getX() - 1, parent->getY(), m[parent->getX() - 1][parent->getY()],
parent->getGCost() + 1, parent);
calcManhattanDistance(child, m);
return child;
}
Node* generateBelowChild(Node *parent, int m[20][20]){
Node *child;
child = new Node(parent->getX() + 1, parent->getY(), m[parent->getX() + 1][parent->getY()],
parent->getGCost() + 1, parent);
calcManhattanDistance(child, m);
return child;
}
void calcManhattanDistance(Node *node, int m[20][20]){
int tempX;
int tempY;
double manhattanDistance;
int differenceX;
int differenceY;
//std::cout << "node x: " << node->getX() << " node y: " << node->getY() << std::endl;
for(int i = 0; i < 20; i++){
for(int j = 0; j < 20; j++){
if(m[i][j] == 3){
tempX = i;
tempY = j;
}
}
}
//sum of term difference, none of these can be negative hense the std::abs
differenceX = tempX - node->getX();
differenceY = tempY - node->getY();
manhattanDistance = std::abs(differenceX) + std::abs(differenceY);
//std::cout << "Manhattan distance: " << manhattanDistance << std::endl;
node->setHCost(manhattanDistance);
}
bool checkInClosedList(std::vector<Node*>& v,int x, int y){
for (std::vector<Node*>::iterator iter = v.begin(); iter != v.end(); ++iter) {
if((*iter)->getX() == x && (*iter)->getY() == y){
return true;
}
}
return false;
}
bool placeInOpen(std::list<Node*>& v,int x, int y){
for (std::list<Node*>::iterator iter = v.begin(); iter != v.end(); ++iter) {
if((*iter)->getX() == x && (*iter)->getY() == y){
return false;
}
}
return true;
}
void checkPath(Node *end, int m[20][20]){
int tempX, tempY;
Node *temp = end;
while(temp != NULL){
tempX = temp->getX();
tempY = temp->getY();
std:: cout << tempX << " " << tempY << std::endl;
m[tempX][tempY] = 4;
temp = temp->getParent();
}
printMap(m);
}
void printMap(int m[20][20]){
std::cout << "printy mcprint" << std::endl;
for(int i = 0; i< 20; i++){
for(int j = 0; j< 20; j++){
std::cout << m[i][j];
}
std::cout<<std::endl;
}
}
节点.cpp
#include <stdlib.h>
#include "Node.h"
Node::Node(){
this->xCoord = 0;
this->yCoord = 0;
this->value = 0;
this->parent = NULL;
this->fCost = 0;
this->gCost = 0;
this->hCost = 0.0;
}
Node::Node(int _x, int _y, int _value, int cost, Node* parent){
this->xCoord = _x;
this->yCoord = _y;
this->value = _value;
this->gCost = cost;
this->parent = parent;
this->hCost = 0.0;
this->fCost = 0;
}
void Node::setParent(Node* par){
this->parent = par;
}
int Node::getX(){
return xCoord;
}
int Node::getY(){
return yCoord;
}
int Node::getValue(){
return value;
}
double Node::getGCost(){
return gCost;
}
double Node::getFCost(){
return gCost + hCost;
}
double Node::getHCost(){
return hCost;
}
Node* Node::getParent(){
return parent;
}
void Node::setHCost(double cost){
this->hCost = cost;
}
Node::~Node(){
delete(this);
}
主要.h
#include "Node.h"
Node* initiateStart(int m[20][20]);
Node* generateLeftChild(Node* parent, int m[20][20]);
Node* generateRightChild(Node* parent, int m[20][20]);
Node* generateAboveChild(Node* parent, int m[20][20]);
Node* generateBelowChild(Node* parent, int m[20][20]);
bool checkInClosedList(std::vector<Node*>& v, int x, int y);
bool placeInOpen(std::list<Node*>& v,int x, int y);
void checkPath(Node *end, int m[20][20]);
void calcManhattanDistance(Node *node, int m[20][20]);
void printMap(int m[20][20]);
节点.h
class Node{
private:
int xCoord;
int yCoord;
int value;
double fCost;
double gCost;
double hCost;
Node* parent;
public:
Node();
Node(int x, int y, int value, int cost, Node* parent);
void setParent(Node* parent);
int getX();
int getY();
int getValue();
double getHCost();
double getFCost();
double getGCost();
Node* getParent();
void setHCost(double hCost);
~Node();
};
struct NodeComparator {
bool operator()(Node* first, Node* second) {
return (first->getFCost() < second->getFCost());
}
};
从 Eclpise 打印运行代码:
Start index: x 0 y 19
end index: x 9 y 2
9 2
9 3
9 4
8 4
7 4
6 4
5 4
4 4
3 4
2 4
2 5
2 6
2 7
2 8
3 8
4 8
5 8
5 9
5 10
5 11
5 12
5 13
5 14
5 15
5 16
5 17
5 18
5 19
4 19
3 19
2 19
1 19
0 19
printy mcprint
00000000000111000004
00000000000111000004
00004444400111000004
00004111400010000004
00004111400000000004
00004111444444444444
00004111110000001000
00004111110000001000
00004111110000001000
00444111111100001000
00000111111000011000
00000111110000000000
00000111110000000000
00011111110000000000
00011111110001000000
00011111110001000000
00000000000001000000
00000000000001000000
00000000000001000000
00000000000001000000
在我尝试编译的目录中(使用 ls
):
Debug Main.cpp main.h main.h.gch Node.cpp Node.h Node.h.gch
编译错误是(using g++ -o astarcpp *.cpp *.h
)
main.h:18:24: error: ‘vector’ is not a member of ‘std’
bool checkInClosedList(std::vector<Node*>& v, int x, int y);
^
main.h:18:40: error: expected primary-expression before ‘*’ token
bool checkInClosedList(std::vector<Node*>& v, int x, int y);
^
main.h:18:41: error: expected primary-expression before ‘>’ token
bool checkInClosedList(std::vector<Node*>& v, int x, int y);
^
main.h:18:44: error: ‘v’ was not declared in this scope
bool checkInClosedList(std::vector<Node*>& v, int x, int y);
^
main.h:18:47: error: expected primary-expression before ‘int’
bool checkInClosedList(std::vector<Node*>& v, int x, int y);
^
main.h:18:54: error: expected primary-expression before ‘int’
bool checkInClosedList(std::vector<Node*>& v, int x, int y);
^
main.h:18:59: error: expression list treated as compound expression in initializer [-fpermissive]
bool checkInClosedList(std::vector<Node*>& v, int x, int y);
^
main.h:19:18: error: ‘list’ is not a member of ‘std’
bool placeInOpen(std::list<Node*>& v,int x, int y);
^
main.h:19:32: error: expected primary-expression before ‘*’ token
bool placeInOpen(std::list<Node*>& v,int x, int y);
^
main.h:19:33: error: expected primary-expression before ‘>’ token
bool placeInOpen(std::list<Node*>& v,int x, int y);
^
main.h:19:36: error: ‘v’ was not declared in this scope
bool placeInOpen(std::list<Node*>& v,int x, int y);
^
main.h:19:38: error: expected primary-expression before ‘int’
bool placeInOpen(std::list<Node*>& v,int x, int y);
^
main.h:19:45: error: expected primary-expression before ‘int’
bool placeInOpen(std::list<Node*>& v,int x, int y);
^
main.h:19:50: error: expression list treated as compound expression in initializer [-fpermissive]
bool placeInOpen(std::list<Node*>& v,int x, int y);
^
最佳答案
构建 C++ 项目通常分两步完成:将所有 .cpp 文件编译成 .o 文件,然后将它们链接在一起成为可执行文件。头文件 (.h) 不会自行编译,只是包含在 .cpp 文件中。
如果您使用的是 Eclipse,则无需知道这一点,因为正如您所见,它会自动透明地为您处理这两个步骤。
但是,如果您是从命令行构建的,则您要么必须自己执行这些步骤,要么使用 Make 之类的工具为您执行这些步骤。
要尝试 Make,请将以下内容放入名为 Makefile
的文件中,然后从命令行运行 make -B
:
astarcpp: Main.o Node.o
Main.o: Main.cpp
Node.o: Node.cpp
关于C++ 在 Eclipse CDT 中编译我的代码它工作正常,但是从命令行这样做会导致大量错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22392540/
猫f1.txt阿曼维沙尔阿杰贾伊维杰拉胡尔曼尼什肖比特批评塔夫林现在输出应该符合上面给定的条件 最佳答案 您可以在文件读取循环中设置一个计数器并打印它, 计数=0 读取行时做 让我们数一数++ if
我正在尝试查找文件 1 和文件 2 中的共同行。如果公共(public)行存在,我想写入文件 2 中的行,否则打印文件 1 中的非公共(public)行。fin1 和 fin2 是这里的文件句柄。它读
我有这个 SQL 脚本: CREATE TABLE `table_1` ( `IDTable_1` int(11) NOT NULL, PRIMARY KEY (`IDTable_1`) );
我有 512 行要插入到数据库中。我想知道提交多个插入内容是否比提交一个大插入内容有任何优势。例如 1x 512 行插入 -- INSERT INTO mydb.mytable (id, phonen
如何从用户中选择user_id,SUB(row, row - 1),其中user_id=@userid我的表用户,id 为 1、3、4、10、11、23...(不是++) --id---------u
我曾尝试四处寻找解决此问题的最佳方法,但我找不到此类问题的任何先前示例。 我正在构建一个基于超本地化的互联网购物中心,该区域分为大约 3000 个区域。每个区域包含大约 300 个项目。它们是相似的项
preg_match('|phpVersion = (.*)\n|',$wampConfFileContents,$result); $phpVersion = str_replace('"','',
我正在尝试创建一个正则表达式,使用“搜索并替换全部”删除 200 个 txt 文件的第一行和最后 10 行 我尝试 (\s*^(\h*\S.*)){10} 删除包含的前 10 行空白,但效果不佳。 最
下面的代码从数据库中获取我需要的信息,但没有打印出所有信息。首先,我知道它从表中获取了所有正确的信息,因为我已经在 sql Developer 中尝试过查询。 public static void m
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我试图在两个表中插入记录,但出现异常。您能帮我解决这个问题吗? 首先我尝试了下面的代码。 await _testRepository.InsertAsync(test); await _xyzRepo
这个基本的 bootstrap CSS 显示 1 行 4 列: Text Text Text
如果我想从表中检索前 10 行,我将使用以下代码: SELECT * FROM Persons LIMIT 10 我想知道的是如何检索前 10 个结果之后的 10 个结果。 如果我在下面执行这段代码,
今天我开始使用 JexcelApi 并遇到了这个:当您尝试从特定位置获取元素时,不是像您通常期望的那样使用sheet.getCell(row,col),而是使用sheet.getCell(col,ro
我正在尝试在我的网站上开发一个用户个人资料系统,其中包含用户之前发布的 3 个帖子。我可以让它选择前 3 条记录,但它只会显示其中一条。我是不是因为凌晨 2 点就想编码而变得愚蠢? query($q)
我在互联网上寻找答案,但找不到任何答案。 (我可能问错了?)我有一个看起来像这样的表: 我一直在使用查询: SELECT title, date, SUM(money) FROM payments W
我有以下查询,我想从数据库中获取 100 个项目,但 host_id 多次出现在 urls 表中,我想每个 host_id 从该表中最多获取 10 个唯一行。 select * from urls j
我的数据库表中有超过 500 行具有特定日期。 查询特定日期的行。 select * from msgtable where cdate='18/07/2012' 这将返回 500 行。 如何逐行查询
我想使用 sed 从某一行开始打印 n 行、跳过 n 行、打印 n 行等,直到文本文件结束。例如在第 4 行声明,打印 5-9,跳过 10-14,打印 15-19 等 来自文件 1 2 3 4 5 6
我目前正在执行验证过程来检查用户的旧密码,但问题是我无法理解为什么我的查询返回零行,而预期它有 1 行。另一件事是,即使我不将密码文本转换为 md5,哈希密码仍然得到正确的答案,但我不知道为什么会发生
我是一名优秀的程序员,十分优秀!