C ++设置类值

时间:2015-04-10 15:16:26

标签: c++ function class

我最近开始使用C ++编写我需要为下一所学校制作的录取作业,我现在看到一个大问题而且我不知道如何修复它。一旦我尝试运行我的代码,它说“Project.exe已停止工作”。我试图在互联网上找到解决方案,但我没有找到任何解决我问题的方法。这是我的代码(SDL部分不是导致问题的部分,但我还是为了代码的完整性而包含它们):

//Using SDL and standard IO
#include <SDL.h>
#include <stdio.h>

//Screen dimension constants
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;

class particle {
    public:
        void setxPos(int xx){
            xP=xx;
        };

        void setyPos(int yy){
            yP=yy;
        };

        void setxVel(int xv){
            xVel=xv;
        };

        void setyVel(int yv){
            yVel=yv;
        };

        int getxPos(){
            return (xP);
        };

        int getyPos(){
            return (yP);
        };

    protected:
        int xP, yP;
        int xVel = 0;
        int yVel = 0;


};

void draw(SDL_Renderer* tempRend, particle drawJelly[6][4]){    //Function created for drawing the lines between the particles


    SDL_RenderDrawLine( tempRend, drawJelly[1][1].getxPos(), drawJelly[1][1].getyPos(), drawJelly[2][1].getxPos(), drawJelly[2][1].getyPos() );
    SDL_RenderDrawLine( tempRend, drawJelly[2][1].getxPos(), drawJelly[2][1].getyPos(), drawJelly[3][1].getxPos(), drawJelly[3][1].getyPos() );
    SDL_RenderDrawLine( tempRend, drawJelly[3][1].getxPos(), drawJelly[3][1].getyPos(), drawJelly[4][1].getxPos(), drawJelly[4][1].getyPos() );
    SDL_RenderDrawLine( tempRend, drawJelly[4][1].getxPos(), drawJelly[4][1].getyPos(), drawJelly[5][1].getxPos(), drawJelly[5][1].getyPos() );
    SDL_RenderDrawLine( tempRend, drawJelly[5][1].getxPos(), drawJelly[5][1].getyPos(), drawJelly[6][1].getxPos(), drawJelly[6][1].getyPos() );
    SDL_RenderDrawLine( tempRend, drawJelly[6][1].getxPos(), drawJelly[6][1].getyPos(), drawJelly[6][2].getxPos(), drawJelly[6][2].getyPos() );
    SDL_RenderDrawLine( tempRend, drawJelly[6][2].getxPos(), drawJelly[6][2].getyPos(), drawJelly[6][3].getxPos(), drawJelly[6][3].getyPos() );
    SDL_RenderDrawLine( tempRend, drawJelly[6][3].getxPos(), drawJelly[6][3].getyPos(), drawJelly[6][4].getxPos(), drawJelly[6][4].getyPos() );
    SDL_RenderDrawLine( tempRend, drawJelly[6][4].getxPos(), drawJelly[6][4].getyPos(), drawJelly[5][4].getxPos(), drawJelly[5][4].getyPos() );
    SDL_RenderDrawLine( tempRend, drawJelly[5][4].getxPos(), drawJelly[5][4].getyPos(), drawJelly[4][4].getxPos(), drawJelly[4][4].getyPos() );
    SDL_RenderDrawLine( tempRend, drawJelly[4][4].getxPos(), drawJelly[4][4].getyPos(), drawJelly[3][4].getxPos(), drawJelly[3][4].getyPos() );
    SDL_RenderDrawLine( tempRend, drawJelly[3][4].getxPos(), drawJelly[3][4].getyPos(), drawJelly[2][4].getxPos(), drawJelly[2][4].getyPos() );
    SDL_RenderDrawLine( tempRend, drawJelly[2][4].getxPos(), drawJelly[2][4].getyPos(), drawJelly[1][4].getxPos(), drawJelly[1][4].getyPos() );
    SDL_RenderDrawLine( tempRend, drawJelly[1][4].getxPos(), drawJelly[1][4].getyPos(), drawJelly[1][3].getxPos(), drawJelly[1][3].getyPos() );
    SDL_RenderDrawLine( tempRend, drawJelly[1][3].getxPos(), drawJelly[1][3].getyPos(), drawJelly[1][2].getxPos(), drawJelly[1][2].getyPos() );
    SDL_RenderDrawLine( tempRend, drawJelly[1][2].getxPos(), drawJelly[1][2].getyPos(), drawJelly[1][1].getxPos(), drawJelly[1][1].getyPos() );

    SDL_RenderPresent( tempRend );                                                 
    SDL_Delay(100);     //Wait .5 seconds for clarity of the drawing
    }

void position(particle posJelly[6][4]){

    int a=0;

    while (a<6){        //Give all the jelly particles a position in the 20x20 grid
        int b=0;
        while(b<4){
            posJelly[a][b].setxPos((20*a));
            posJelly[a][b].setyPos((20*b));
        b--;
        }
    a--;
    }
}

int main( int argc, char* args[] )
{
    SDL_Window* window = NULL;
    SDL_Renderer* renderer = NULL;
    SDL_Surface* surface = NULL;

    SDL_Init( SDL_INIT_VIDEO );

    window = SDL_CreateWindow( "Jelly Game", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN );
    renderer = SDL_CreateRenderer( window, -1, 0);
    surface = SDL_GetWindowSurface( window );

    SDL_SetRenderDrawColor( renderer, 0, 255, 0, 255 );
    SDL_RenderPresent( renderer );

    particle jelly[6][4];           //New object from class "particle" with name jelly

    position(jelly);                //Run function "position()" on particle jelly to set starting coördinates

    bool inGame=true;              //Start the game-loop

    while(inGame){
        draw(renderer, jelly);
        inGame=false;
    }

    SDL_Delay( 2000 );              //Wait 2 seconds

    SDL_DestroyWindow( window );    //Destroy the window "window"

    SDL_Quit();                     //Quit SDL

    return 0;                       //End the program
}

现在,我已经找到了原因所在,这就是这一部分:

void position(particle posJelly[6][4]){

    int a=0;

    while (a<6){        //Give all the jelly particles a position in the 20x20 grid
        int b=0;
            while(b<4){
            posJelly[a][b].setxPos((20*a));
            posJelly[a][b].setyPos((20*b));
            b--;
        }
        a--;
    }
}

因为当我删除

position(jelly);

或删除

posJelly[a][b].setxPos((20*a));
posJelly[a][b].setyPos((20*b));

在位置函数内部,它不会给出错误。 (它无法正常工作,因为它没有正确的坐标来绘制和使用,但它“有效”)

同样,我在很多其他文章和教程中搜索了为什么这不起作用或如何使其可以工作,但还没有找到任何内容。

'游戏'将是一团果冻,由24颗颗粒(6x4,但只有外部颗粒涂在屏幕上)组成,它们与它们的neigbors有一个理想的距离,然后当它们靠近时或者远离彼此,它们将被拉伸/推回到那个距离,从而产生一团果冻的“弹跳”效果。

请帮忙!

另外,我知道Draw()函数不是很专业,但它不会是一个完全发布的游戏,而且因为blob总是会是6乘4,这只是一种方式绘画方式比通过循环和东西找到外部粒子。

3 个答案:

答案 0 :(得分:1)

您正尝试使用负索引访问数组。在第一次迭代中将b设置为0,然后将其递减以使其为-1。然后你在下一次迭代中使用b,程序就会蓬勃发展。你可能想用++而不是 - 。

答案 1 :(得分:0)

分别用增量:a--b--替换递减运算符a++b++

答案 2 :(得分:0)

在这种情况下,错误与数组索引的负值有关。 当程序引发了一个exeption并且你没有处理它时,你会看到类似的错误。

你应该改变:

对于a--b--

a++b++

您的代码第一次到达行:

posJelly[a][b].setxPos((20*a));
posJelly[a][b].setyPos((20*b));

a==0b==0,但第二次(在a--b--之后)你会有这样的事情:

posJelly[-1][-1].setxPos((20*a));  // illegal C++ no negative inidices are allowed
posJelly[-1][-1].setyPos((20*b));  // illegal C++ no negative inidices are allowed