我是一名初学程序员,正在使用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;
请帮忙......
答案 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
?)。