c++ - 尝试访问类内部的 bool 值时出现段错误

标签 c++ segmentation-fault

const int PIXEL_WIDTH = 10;
const int PIXEL_HEIGHT = 10;
const int WORLD_X = 64; //WORLD_X * PIXEL WIDTH = SCREEN_WIDTH if you want the world to be the same size as the screen
const int WORLD_Y = 64;

enum Pixel_Types {
    AIR,
    WALL,
    DIRT,
    STONE
};

class Pixel
{
    int x, y;
    bool affected_by_gravity;
    Pixel_Types type;
    public:
        Pixel() : affected_by_gravity(false), type(AIR), x(0), y(0) {}
        Pixel(int temp_x, int temp_y) : affected_by_gravity(false), type(AIR), x(temp_x), y(temp_y) {}

        int getX() { return x; } //x is 0-63, scales up in the rendering code
        int getY() { return y; } //y is 0-63, scales up in the rendering code

        int getScreenX() { return x*PIXEL_WIDTH; } //x is 0-63, scales up in the rendering code
        int getScreenY() { return y*PIXEL_HEIGHT; } //y is 0-63, scales up in the rendering code

        bool setDeltaX(int temp_delta_x);
        bool setDeltaY(int temp_delta_y);

        void setAffectedByGravity(bool yesorno) { affected_by_gravity = yesorno; }
        bool getAffectedByGravity() { return affected_by_gravity; }

        Pixel_Types getType() { return type; }
        void setType(Pixel_Types what_type) { type = what_type; }//if (type == DIRT or type == STONE) { affected_by_gravity = true; } }
};

std::vector<Pixel> world; //the world is a dynamically allocated thing

Pixel* getPixelFromCoordinates(int x, int y)
{
    if (x > 63) x = 63;
    else if (x < 0) x = 0;
    if (y > 63) y = 63;
    else if (y < 0) y = 0;

    for (int pixel_index = 0; pixel_index < world.size(); pixel_index++) {
        if (world.at(pixel_index).getX() == x && world.at(pixel_index).getY() == y) {
            return &world.at(pixel_index);
        }
    }
    return NULL;
}

bool Pixel::setDeltaX(int temp_delta_x) {
    if (x+temp_delta_x > SCREEN_WIDTH/PIXEL_WIDTH or x+temp_delta_x < 0) {
        return false;
    }
    if (getPixelFromCoordinates(x+temp_delta_x, y)->type == AIR) {
        x += temp_delta_x; 
        return true;
    }
    return false;
}

bool Pixel::setDeltaY(int temp_delta_y) { 
    if (y+temp_delta_y > SCREEN_HEIGHT/PIXEL_HEIGHT or y+temp_delta_y < 0) {
        return false;
    }
    if (getPixelFromCoordinates(x, y+temp_delta_y)->type == AIR) {
        y += temp_delta_y; 
        return true;
    }
    return false;
}

void generateWorld()
{
    for (int world_generation_index = 0; world_generation_index < 4096; world_generation_index++) {
        int x = world_generation_index % WORLD_X; //the world is 64 pixels left and right, and 64 up and down. this math is pretty easy and just extrapolates that. also each pixel is 10 pixels across, times 64 pixels = 640 (the resolution)
        int y = floor(world_generation_index / WORLD_Y); //both x and y start at 0
        world.push_back(Pixel(x, y));


        if (x == 0 || x == 63) {
            world.at(world_generation_index).setType(WALL);
        }

        if (y == 1) {
            world.at(world_generation_index).setType(WALL);
        }    

    }
    std::cout << "World size: " << world.size() << std::endl;
}

void createPixel(int x, int y, Pixel_Types type) 
{
    std::cout << x << std::endl;
    std::cout << y << std::endl << std::endl;
    y = (SCREEN_HEIGHT / PIXEL_HEIGHT) - y; //compensate for the stupid inverted y in opengl
    //if (getPixelFromCoordinates(x, y)->getType() == AIR) {
        getPixelFromCoordinates(x, y)->setType(type);
    //}
}

void physicsOneStep() 
{
    for (int pixel_index = 0; pixel_index < world.size(); pixel_index++) {
        if (world.at(pixel_index).getType() == DIRT or world.at(pixel_index).getType() == STONE) {//if (world.at(pixel_index).getAffectedByGravity()) {
            world.at(pixel_index).setDeltaY(-1);
            //std::cout << world.at(pixel_index).getX() << std::endl;
            //std::cout << world.at(pixel_index).getY() << std::endl << std::endl;
        }
    }
}

因此,当我尝试运行此代码(较大项目的一部分)时,它偶尔会在从 createPixel() 中调用 setType(DIRT) 时出现段错误。我知道提供给 createPixel() 的值在允许的范围内(0 到 64)。如果您在同一位置单击(调用 createPixel())两次,这似乎是段错误。调试器说段错误的行是

void setType(Pixel_Types what_type) { type = what_type; }

不过,我已验证我为此提供的值是正确的。

最佳答案

由于类内部没有动态分配,所以在这种分配上出现段错误很可能是因为 this 指针本身不正确(NULL 或分配错误)。当出现段错误时,您应该进行回溯,以查看如何分配调用 setType 的对象。例如,行不应该

world.push_back(Pixel(x, y));

成为

world.push_back(new Pixel(x,y)); 

?

关于c++ - 尝试访问类内部的 bool 值时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21640039/

相关文章:

c++ - 了解警告 : binding r-value to l-value reference

c - 使用时间函数时出现段错误(核心转储)错误

r - 在 R 中将 dplyr::mutate 与 lubridate::ymd_hms 组合随机会导致段错误

c++ - 为什么当我在谷歌测试程序中定义一个 const 字符串时会发生段错误?

char [] 和 sprintf 段错误

c++ - 是否可以在 C++ 中使用递归 vector ?

c++模板参数的自动模板推导失败

c++ - md5sum 包含总和本身的文件?

c++ - 为什么按值传递给函数和按值传递给另一个构造函数时,构造函数的调用存在差异?

c - ubuntu 上的段错误,在 debian 上运行