带有数组的简单代码中的错误

时间:2014-08-15 09:14:56

标签: c++

我有这个小代码片段

class MazeClass{
    public:
        void printMaze(){
            for (int y=0; y<N;y++){
                cout <<Map[y]<<endl;
            }
        }
        void moveMe(){
            if (GetAsyncKeyState(VK_UP) !=0){
                if ((Map[myLocation[0]][myLocation[1]-1])) ==' '){
                    Map[myLocation[0]][myLocation[1]]) =' ';
                    Map[myLocation[0]][myLocation[1]-1]) ='@';
                    myLocation[1]--;
                }
            }
        }

    private:
        char Map [N][N+1] =     {"##########",
                                "#@       #",
                                "#        #",
                                "#        #",
                                "#        #",
                                "#        #",
                                "#        #",
                                "#        #",
                                "#        #",
                                "##########"};
        int myLocation[2]={1,1};
};

当我尝试编译它时,它给了我一个错误:

  

F:\ C ++ \ Maze \ main.cpp | 17 |错误:在&#39; ==&#39;之前预期的主要表达式令牌

     

F:\ C ++ \ Maze \ main.cpp | 17 |错误:预期&#39;;&#39;之前&#39;)&#39;令牌|

第17行

if ((Map[myLocation[0]][myLocation[1]-1])) ==' '){

我真的希望你们能帮忙,我已经坚持了一个多小时。

3 个答案:

答案 0 :(得分:1)

if ((Map[myLocation[0]][myLocation[1]-1])) ==' ')更改为:

 if ((Map[myLocation[0]][myLocation[1]-1]) ==' '){

你有一个额外的结束括号

编译器错误可以帮助您,学习阅读它们:

你有:

error: expected primary-expression before '==' token| F:\C++\Maze\main.cpp|17|error: expected ';' before ')

所以你看看第17行及其之前和之后的行并查找错误(如果它更简单,就像语法一样,你应该能够解决它)。 调试器可以解决更复杂的错误。

而且,您使用的是哪种编辑器,因为大多数编辑器都具有在您定位到另一个时突出显示匹配括号的功能,从而避免了这个问题。

答案 1 :(得分:1)

你的括号有问题,这是好的变种:

   void moveMe(){
      if (GetAsyncKeyState(VK_UP)!=0){
         if ((Map[myLocation[0]][myLocation[1]-1]) ==' ')
         {
            Map[myLocation[0]][myLocation[1]] =' ';
            Map[myLocation[0]][myLocation[1]-1] ='@';
            myLocation[1]--;
         }
      }
   }

此外,您无法像这样初始化类成员:

private:
    char Map [N][N+1] =     {"##########",
                            "#@       #",
                            "#        #",
                            "#        #",
                            "#        #",
                            "#        #",
                            "#        #",
                            "#        #",
                            "#        #",
                            "##########"};
    int myLocation[2]={1,1};
在课堂上

你只能声明它们,并在以后初始化,例如当调用构造函数时。

答案 2 :(得分:0)

你的风格导致可读性问题。
我重写了一点,以显示更好的风格

#include <array>

template<int N>
class MazeClass
{

    typedef array<char,N> Line;
    typedef array<Line,N> Map;

    const char clearchar = ' ';
    const char wallchar  = '#';
    const char dudechar  = '@';

    struct Pos { int x,y; };

    void moveTo(int dx,int dy)
    {
        int tox = mypos.x+dx;
        int toy = mypos.y+dy;
        if ( map[tox][toy] == clearchar )
        {
            map[mypos.x][mypos.y] = clearchar; // clear old
            map[tox][toy] = dudechar;          // set new
            mypos = Pos{ tox,toy };            // update pos
        }
    }

public:

    MazeClass()
    {
        for( auto& l : map )
            for( auto& c : l )
                c=clearchar;
        for(int i=0;i<N;++i)
        {
            map [0]   [i]   = wallchar;
            map [N-1] [i]   = wallchar;
            map [i]   [0]   = wallchar;
            map [i]   [N-1] = wallchar;
        }
        map[mypos.x][mypos.y] = dudechar ;
    }

    void printMaze()
    {
        for( auto& l : map )
        {
            for( auto& c : l )
                cout << c;
            cout << endl;
        }
    }

    void moveMe()
    {
        if ( GetAsyncKeyState(VK_UP) )  moveTo(0,-1);
        // etc
    }

private:

    Map map;

    Pos mypos = Pos{1,1};

};

void tryit()
{
    MazeClass<10> maze;

    maze.printMaze();
    maze.moveMe();
}