Каждый раз, когда я компилирую свой простой код SDL1.2, он успешно компилируется
но когда я пытаюсь запустить его через терминал (альт+T в Ubuntu):
./game
Segmentation fault (core dumped)
Я получаю эту ошибку. Можете ли вы помочь, пожалуйста? Это код:
#include<SDL/SDL.h>
int main(int argc,char args)
{
SDL_Init( SDL_INIT_EVERYTHING);
SDL_Surface* screen;
screen=SDL_SetVideoMode(640,480,32,SDL_HWSURFACE);
SDL_Flip(screen) ![problem running the program][1];
SDL_Delay(5000);
SDL_FreeSurface(screen);
SDL_Quit();
}
SDL_SetVideoMode
возвращается NULL
на ошибку, которую вы не проверяете.
Поскольку вы запускаете это через терминал, я подозреваю, что вы, возможно, забыли сказать Xorg разрешить запуск с него. На самом деле, если это действительно проблема, это предотвратит любой программа запускается при запуске таким образом.
Чтобы решить проблему, введите это в терминал (это нужно сделать только один раз за сеанс):
xhost +
Вы должны получить сообщение, что это было успешно. Я не могу вспомнить точное сообщение, но это что-то вроде этого:
Clients are now allowed to connect from any host.
Что происходило (при условии, что я был прав в отношении xhost
) было что SDL_SetVideoMode()
звонок не удался и вернулся NULL
потому что Xorg отклонил соединение. Поскольку вы не проверяете это, SDL_Flip()
закончил разыменование NULL
указатель — отсюда и ошибка.
ПРИМЕЧАНИЕ: В вашем коде есть ошибка, а именно — вам следует не вызов SDL_FreeSurface(screen);
; эта конкретная поверхность особенная, и освобождается SDL_Quit();
автоматически. Источник (см. Раздел «Возвращаемое значение»): http://www.libsdl.org/release/SDL-1.2.15/docs/html/sdlsetvideomode.html
Проверить, если SDL_SetVideoMode()
не удалось!
screen = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE);
if (screen == NULL) /* error */;
Запустите его под Valgrind. Или ГБД. Или другой отладчик на ваш выбор.
Вы, вероятно, должны быть успешно выделяя память для экрана.