Использование malloc для структур / массивов в других файлах - PullRequest
0 голосов
/ 12 ноября 2018

ОБНОВЛЕНИЕ: Проблема с ошибкой сегментации не в этой функции, как описано ниже, она в другой функции той же программы.

Я пытаюсь создать программу, которая анимируетпрыгающие шары, однако я застрял и не могу понять, что я делаю неправильно.Я считаю, что я выделил проблему, чтобы быть в функции ниже.Я понял, что это как-то связано с утверждениями новой модели.

В любом случае, после запуска кода я получаю ошибку сегментации, и значения, выведенные функцией (в терминах треугольников), находятся далеко от того места, где они должны быть.Я должен получать значения от 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;
}

Внимание!Указатель модели 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;
};

1 Ответ

0 голосов
/ 12 ноября 2018

Эта строка копирует только первый треугольник:

*new->model = *model;

С точки зрения вашей функции model является только указателем на объект.Компилятор не знает, что он указывает на массив треугольников, поэтому нам нужно передать количество треугольников в качестве аргумента.

Заменить его на:

memcpy( new->model, model, sizeof(triangle_t)*numtriangles);

Дополнительные комментарии:

  • Не забудьте освободить model при освобождении object
  • Замените new на что-то еще, например newObj, если вы когда-нибудь захотите скомпилировать это с помощью c ++компилятор

Дополнительная информация:

[РЕДАКТИРОВАТЬ] Относительно сегментацииошибка: ваша функция сейчас правильная, и она не вызывает SEGFAULT, если у вас не хватает памяти, что очень маловероятно.В любом случае, если вам не хватает памяти и вы получаете SEGFAULT в этой функции, то проблема в том, что:

  • вы неправильно освобождаете память где-то еще, а затем происходит утечка памяти, из-за которой вы исчерпываетепамяти ненадлежащим образом.
  • вашей платформе требуется больше памяти, что, хотя и маловероятно, возможно, особенно если это ограниченная встроенная платформа

Опубликуйте еще один вопрос с обратным следом ошибки сегмента.

...