更新:分段错误的问题不在此函数内,如下所述,它在同一程序的另一个函数内。
我正在尝试制作一个动画弹跳球的程序,但是我很困,无法弄清楚我在做什么错。我相信我已经将问题隔离在下面的功能之内。我已经弄清楚它与新模型语句有关。
无论如何,在运行代码时,我遇到了段错误,并且函数绘制的值(以三角形表示)偏离了应有的位置。我应该获得介于0到1600之间的值,但是有时我最终得到94百万。
任何帮助将不胜感激!
object_t *create_object(SDL_Surface *surface, triangle_t *model, int numtriangles){
object_t *new=malloc(sizeof(object_t));
new->surface = surface;
new->model = malloc(sizeof(triangle_t)*numtriangles);
*new->model= *model;
new->numtriangles = numtriangles;
new->tx = surface->w/2;
new->ty = surface->h/2;
new->scale = 0.1;
new->rotation = 0.0;
return new;
}
NB! Triangle_t *模型指针指向一个描述多个三角形的数组。
编辑: 包括对象的结构:
typedef struct object object_t;
struct object {
float scale; /* Object scale */
float rotation; /* Object rotation */
float tx, ty; /* Position on screen */
float speedx, speedy; /* Object speed in x and y direction */
unsigned int ttl; /* Time till object should be removed from screen */
int numtriangles; /* Number of triangles in model */
triangle_t *model; /* Model triangle array */
SDL_Surface *surface; /* SDL screen */
};
以及三角形的结构:
typedef struct triangle triangle_t;
struct triangle {
/* Model coordinates, where each pair resemble a corner */
int x1, y1;
int x2, y2;
int x3, y3;
/* The color the triangle is to be filled with */
unsigned int fillcolor;
/* Scale factor, meaning 0.5 should half the size, 1 keep, and 2.0 double */
float scale;
/* The point (tx, ty) where the center of the teapot should be placed on-screen */
int tx, ty;
/* The degrees the triangle is supposed to be rotated at the current frame */
float rotation;
/*
* Bounding box of on-screen coordinates:
* rect.x - x-coordinate of the bounding box' top left corner
* rect.y - y-coordinate of the bounding box' top left corner
* rect.w - width of the bounding box
* rect.h - height of the bounding box
*/
SDL_Rect rect;
/* On-screen coordinates, where each pair resemble a corner */
int sx1, sy1;
int sx2, sy2;
int sx3, sy3;
};
答案 0 :(得分:2)
此行仅复制第一个三角形:
*new->model = *model;
从函数model
的角度来看,它只是一个指向对象的指针。编译器不知道它指向三角形数组,因此我们需要将其中的三角形数量作为参数传递。
替换为:
memcpy( new->model, model, sizeof(triangle_t)*numtriangles);
其他评论:
model
时释放object
new
之类的东西代替newObj
更多信息:
[编辑] 关于分段错误:您的函数现在是正确的,除非内存不足,否则不会引起SEGFAULT,这是非常不可能的。无论如何,如果您的内存不足并在该函数中获取SEGFAULT,则问题可能是:
发布另一个带有段错误回溯的问题。