В вашем коде есть несколько странностей.
Во-первых,
int situador(SDL_Surface * dib,struct sit_per per)
{
SDL_Rect pos;
struct sit_per * est;
est=&per;
пусть это будет
int situador(SDL_Surface * dib,struct sit_per *per)
{
SDL_Rect pos;
struct sit_per * est = per; // assignment can be made later
просто стиль, избегая слишком большого объема данных и копирования настек.
Использование цикла for также может быть опцией;
for(est = per; est != NULL; est = est->si)
Если функция всегда возвращает фиксированное значение, вы можете заставить ее ничего не возвращать ...;Итак, void situador(...)
вместо int situador(...)
.
Функция creador
загружает 9 изображений, когда требуется только 8 (по одному на каждое направление, я полагаю), это источник для segfault;не жестко кодировать (абсолютные) пути к файлам, как сказано выше.
Чтобы выйти из цикла for, используйте ключевое слово break , избегайте в общем случае изменения переменной цикла (если только вы неесть веская причина, и здесь я не вижу ни одной).Опять же, цикл for для 9 изображений, где у вас есть место только для 8 в вашем массиве.Если вам нужно 9-е изображение, вы должны написать SDL_Surface * img[9];
.Это может сбивать с толку, но когда вы объявляете массив, число в скобках - это количество элементов, а при доступе индекс начинается с 0, так что последний элемент имеет индекс N-1.
весь финальный кусок может стать
for(x = 0; x < NUM_OF_ELEMENT; x++)
if(!per->img[x])
break;
if (x < NUM_OF_ELEMENT)
{
int y;
for(y = 0; y < x; y++)
SDL_func_to_free_loaded_images(per->img[y]);
free(per);
return NULL;
}
else
return per;
обычно лучше использовать именованные константы, а не число;например,
#define NUM_OF_ELEMENT 8
#define NUM_OF_DES 50
и т. д.
struct personaje
{
char des[NUM_OF_DES];
SDL_Surface * img[NUM_OF_ELEMENT];
int dir;
int x;
int y;
};
и т. д. (конечно, вы выберете другое имя, например, NUM_OF_DIRS или NUM_OF_IMAGES или любую другую предпочитаемую вами форму на вашем языке)