2016-04-07 84 views
-5

這裏的程序指針就給賽格故障

#include <iostream> 
    #include <time.h> 
    #include <conio.h> 
    #include <cstdlib> 
    #include <windows.h> 

    using namespace std; 

    const int widht = 117,height = 26; 

    class Paddle 
    { 
    private: 
     int y; 
     int originalY; 
    public: 
     Paddle() 
     {   
      y=height/2-2; 
      originalY=y; 
     } 
     inline int getY() 
     { 
      return y; 
     } 
     inline void moveUp() 
     { 
      y--; 
     } 
     inline void moveDown() 
     { 
      y++; 
     } 
     void checkWall() 
     { 
      if (y<0) 
      { 
       while (y<0) 
       { 
       y++; 
       } 
      } 
      else if (y>height) 
      { 
       while (y>height) 
       { 
       y--; 
       } 
      } 
     } 
     void Reset() 
     { 
     y=originalY; 
     } 
    }; 

    class Ball 
    { 
    private: 
     int x,y; 
     int originalX,originalY; 
    public: 
     Ball() 
     { 
      x=widht/2; 
      y=height/2; 
      originalX=x; 
      originalY=y; 
     } 
     inline int getX() 
     { 
      return x; 
     } 
     inline int getY() 
     { 
      return y; 
     } 
     inline void moveRight() 
     { 
      x++; 
     } 
     inline void moveUpRight() 
     { 
      x++; 
      y--; 
     } 
     inline void moveDownRight() 
     { 
      x++; 
      y++; 
     } 
     inline void moveLeft() 
     { 
      x--; 
     } 
     inline void moveUpLeft() 
     { 
      y--; 
      x--; 
     } 
     inline void moveDownLeft() 
     { 
      y++; 
      x--; 
     } 
     inline void Reset() 
     { 
      x=originalX; 
      y=originalY; 
     } 
    }; 

    class Manager 
    { 
    private: 
     int score1,score2; 
     int columns, rows; 
    public: 
     int p1y; 
     int p2y; 
     int ballX,ballY; 
     bool gameOver; 
     Manager() 
     { 
      gameOver = false; 
     } 
     void Draw(Paddle *p1,Paddle *p2,Ball *b) 
     { 
      system("cls"); 
      p1y=p1->getY(); 
      p2y=p1->getY(); 
      ballX=b->getX(); 
      ballY=b->getY(); 
      for (int i=0;i<height;i++) 
      { 
       for (int j=0;j<widht;j++) 
       { 
        if (i==p1y && j==2) 
        { 
         cout << "\xDB"; 
        } 
        else if (i==p1y+1 && j==2) 
        { 
         cout << "\xDB"; 
        } 
        else if (i==p1y+2 && j==2) 
        { 
         cout << "\xDB"; 
        } 
        else if (i==p1y+3 && j==2) 
        { 
         cout << "\xDB"; 
        } 
        else if (i==p1y+4 && j==2) 
        { 
         cout << "\xDB"; 
        } 
        else if (i==p2y && j==widht-1) 
        { 
         cout << "\xDB"; 
        } 
        else if (i==p2y+1 && j==widht-1) 
        { 
         cout << "\xDB"; 
        } 
        else if (i==p2y+2 && j==widht-1) 
        { 
         cout << "\xDB"; 
        } 
        else if (i==p2y+3 && j==widht-1) 
        { 
         cout << "\xDB"; 
        } 
        else if (i==p2y+4 && j==widht-1) 
        { 
         cout << "\xDB"; 
        } 
        else if (i==ballX && j==ballY) 
        { 
         cout << "O"; 
        } 
        cout << " "; 
       } 
       cout << endl; 
      } 
      cout << p1 -> getY(); 
     } 
     void Input(Paddle *p1,Paddle *p2) 
     { 
      if (_kbhit()) 
      { 
       switch(_getch()) 
       { 
        case 'w': 
         p1->moveUp(); 
         break; 
        case 's': 
         p1->moveDown(); 
         break; 
        case 'i': 
         p2->moveUp(); 
         break; 
        case 'k': 
         p2->moveDown(); 
         break; 
       } 
      } 
     } 
     void Run(Paddle *p1,Paddle *p2, Ball *b) 
     { 
      while(!gameOver) 
      { 
       Draw(p1,p2,b); 
       Input(p1,p2); 
       Sleep(10); 
      } 
     } 
    }; 

    int main() 
    { 
     Paddle *p1; 
     Paddle *p2; 
     Ball *b; 
     Manager *m; 
     m->Run(p1,p2,b); 
     return 0; 
    } 

我不明白爲什麼當我啓動程序給它(與調試器)分段錯誤。 我認爲原因是指針,因爲在它完美工作之前(但沒有修改值); Hae的任何提示?

+4

你有沒有嘗試用調試器通過你的代碼? – Ceros

+0

歡迎來到Stack Overflow。如果你還沒有閱讀,請閱讀[關於]頁面。但更迫切的是,請閱讀如何創建一個MCVE([MCVE])。目前還不清楚你的代碼是否很小 - 看起來相當長。 –

+0

只給出你認爲給出錯誤的部分代碼。 – AkaSh

回答

0

您還沒有爲主要方法中的PaddleBallManager變量分配任何內容。

默認情況下,將不會被初始化,並將指向內存中的某處,這可能會或可能不會被您的應用程序訪問。當你訪問它們並且內存不可訪問時,你會看到你正在觀察的訪問衝突或段錯誤。

您可以採取兩種方法。如果你改變你的主,如下所示:

int main() 
{ 
    Paddle p1; 
    Paddle p2; 
    Ball b; 
    Manager m; 
    m.Run(&p1,&p2,&b); 
    return 0; 
} 

然後,每個類的實例將存在於堆棧中。由於應用程序退出m.Run返回,所以使用此方法是安全的,因爲對象的生命週期比Run調用的代碼更長。

或者,您可以在堆上分配它們。在這種情況下,你可以使用:

int main() 
{ 
    std::unique_ptr<Paddle>(new Paddle); 
    std::unique_ptr<Paddle>(new Paddle); 
    std::unique_ptr<Ball>(new Ball); 
    std::unique_ptr<Manager>(new Manager); 
    m->Run(p1.get(),p2.get(),b.get()); 
    return 0; 
} 

unique_ptr將舉行一個指向Paddle等在堆上分配,並會自動清理你一旦main方法返回。

+0

我一直在想,爲什麼你會在這種情況下選擇unique_ptr? – Ceros

+0

在這種情況下,我可能不會 - 堆棧分配的對象更簡單,並達到完全相同的效果。我將它列入以說明堆分配的替代方案。如果我構建了一些將傳遞到管理器和所有權的對象,我會在這個上下文中使用'unique_ptr',並且要確保如果安裝程序部分失敗,那麼之前構建的對象將被清理。 –

2

你從來沒有分配給任何內存,你永遠不初始化

Paddle *p1; 
Paddle *p2; 
Ball *b; 
Manager *m; 

使用這些指針被undefined behavior

而不是使用指針,你應該你所有的物體變成定期自動對象,如

Paddle p1; 
Paddle p2; 
Ball b; 
Manager m; 

然後通過參考在你的函數,而不是通過指針傳遞他們。

0
Manager *m; 
    m->Run(p1,p2,b); 

在給變量賦值之前,您不能使用變量的值。您不會爲m分配一個值,但是您立即使用它。這不可能正常工作。

代碼Manager *m;只是聲明瞭一個名爲m的變量,其類型爲pointer to Manager。但它還沒有指向任何東西。

代碼m->Run(p1,p2,b);調用m指向的Manager上的Run方法。如果m沒有指向類Manager的實例,則這樣做沒有意義。