C ++指针参数有问题

时间:2014-07-07 00:41:19

标签: c++ pointers parameters

我是一名初学程序员,正在使用SDL编写图形游戏。将图块表拆分为多个部分或"剪辑"并将其放入一个数组中,并绘制特定的"剪辑"在屏幕上没有按预期工作。

void split_tilesheet(int width, int height, int space, Entity * ent){
    std::cout << "Splitting Tileset...";

    int t_width = (width / SPR_W);
    int t_height = (height / SPR_H);
    int numTiles = (t_width * t_height);

    ent = new Entity [numTiles + 1];
    if( ent == NULL){
        err("!failed to alloc!");
    }else{
        std::cout << "allocated"<< std::endl;
    }
    int count = 0;
    for(int i = 0; i < t_width; i++){
        for(int j = 0; j < t_height; j++){

            ent[count].bounds.x =  i * SPR_W;
            ent[count].bounds.y = j * SPR_H;
            ent[count].bounds.w = SPR_W;
            ent[count].bounds.h = SPR_H;
            ent[count].id = ent[i].x + ( ent[i].y * t_width);
            count++;
        }
    }
}

void draw_room(char tiledata[MAP_MAX_X][MAP_MAX_Y], Entity * ent){
SDL_Rect bounds;
    for(int x  = 0; x < MAP_MAX_X; x++){
        for(int y = 0; y < MAP_MAX_Y; y++){

            if(tiledata[x][y] == '0' || tiledata[x][y] == ' ' || tiledata[x][y] == '\n' ){
                draw_img(x * SPR_W , y * SPR_H, tiles, bounds, ent[0].bounds); 
            }
            if(tiledata[x][y] == '1'){
                draw_img(x * SPR_W , y * SPR_H, tiles, bounds, ent[1].bounds);
            }
        }           
    }
}

class Entity
{
public:
    SDL_Rect bounds;
    SDL_Surface* sprite;
    int id;
    int x;
    int y;
    int w, h;
 };

我试图使用指针在运行时动态分配内存。 该程序编译,但段错误。 gdb说segfault是由于draw_room()函数,但我无法弄清楚原因。我传递给draw_room函数的指针是:

Entity * floor0_clips = NULL;

这不起作用

Entity * floor0_clips;

请帮忙......

1 个答案:

答案 0 :(得分:2)

C ++使用pass-by-value(除非你指定pass-by-reference),你没有这样做。

函数中的变量是给定参数的副本。例如:

int func(int x)
{
    x = 5;
}

int main()
{
    int y = 6;
    func(y);
    // here, `y` is still `6`
}

您的情况基本上与此相同。您将floor0_clips发送给函数,该函数会更新它的副本,保留原始函数。

要使用传递引用,请将&符号放在函数参数列表中的变量名之前,即在您的情况Entity * &ent中。不要在调用函数的代码中更改任何内容;函数的参数列表声明决定了值是按值传递还是按引用传递。

NB。您似乎分配了太多实体(为什么+ 1?)。