В настоящее время я учусь кодировать на SDL, используя C ++ в качестве базового языка программирования.
В общем, что происходит, у меня есть кусок кода с циклом внутри, который будет отображать изображение, пока цикл не начнется снова. Цикл длится 5 секунд, и в программе есть итератор i, установленный в 0, который увеличивается с каждым циклом, пока не достигнет пяти, когда выйдет из цикла через разрыв. Затем SDL завершает работу, как ожидается, и программа завершается.
Там нет ошибок компиляции, только к вашему сведению. Когда я запускаю программу, основной цикл запускается один раз, а затем появляется программа, которая сама закрывается, выводя в окне моего терминала сообщение «Ошибка сегментации (ядро сброшено)».
Что это значит, и что можно сделать, чтобы этого не произошло? Заранее спасибо.
РЕДАКТИРОВАТЬ: код этот, извините за то, что не написал раньше. Я пишу это по памяти, так как сейчас меня нет дома.
#include <iostream>
#include <SDL.h>
int main( int argc, char** argv )
{
SDL_Surface* media;
SDL_Surface* window;
int i = 0;
SDL_Init( SDL_INIT_EVERYTHING );
window = SDL_SetVideoMode( 1920, 1080, 32, SDL_SWSURFACE );
media = SDL_LoadBMP( "xD.bmp" );
while( true )
{
SDL_BlitSurface( media, NULL, window, NULL );
SDL_Delay( 5000 );
if( i == 5 )
{
break;
}
i++;
}
SDL_FreeSurface( media );
SDL_Quit( );
return 0;
}
РЕДАКТИРОВАТЬ 2: предыдущий, если (я = 5) был типографский и был исправлен.
РЕДАКТИРОВАТЬ 3: Я прибыл домой и проверил мой код. Я не печатал if (i=5)
Я счастлив, потому что это довольно глупая ошибка. Я также попытался уменьшить размер окна безуспешно, поэтому мы вернулись к основной проблеме.
Кроме того, я попытался удалить цикл, и программа запускается и во время закрытия выдает ошибку, так что, по крайней мере, это не ошибка цикла. Но сейчас это большая проблема. Кстати, я выложу реальный скомпилированный код, потому что предыдущий был написан по памяти.
#include <iostream>
#include <SDL/SDL.h>
int main (int argc, char** argv)
{
SDL_Surface* window;
SDL_Surface* media;int i;
SDL_Init (SDL_INIT_EVERYTHING);
window = SDL_SetVideoMode (2058, 1152, 32, SDL_SWSURFACE);
media = SDL_LoadBMP("xD.bmp");
while (true)
{
i++;
SDL_BlitSurface(media, NULL, window, NULL);
SDL_Flip(window);
SDL_Delay(5000);
SDL_FreeSurface(media);
if (i==5)
{
break;
}
}
SDL_FreeSurface(media);
SDL_Quit();
return 0;
}
Я просто надеюсь, что это происходит только со мной, потому что это довольно запутанная вещь, чтобы исправить.
Мир, ребята.
SDL_FreeSurface(media);
на каждой итерации цикла, а затем еще раз после цикла прерывается. Это неправильно, после free
media
является висящим указателем и больше не указывает на правильное местоположение. Удалите это из цикла, нет никаких причин держать его там.
Также, как было указано в комментарии к вопросу, проверьте значения window
а также media
, Нет гарантии, что изображение существует и может быть загружено, поэтому оно может быть NULL
,
the main loop is run one single time and then the programs appears to close it self
Если это не опечатка, то измените
if( i = 5 )
в
if( i == 5 )
i = 5
операция всегда будет оценивать TRUE
и таким образом вызвать break
, Помимо этого, программа работает на моем компьютере без ошибок сегментации.
Ошибки сегментации возникают, когда вы пытаетесь получить доступ к памяти, чего не следует делать. Например, ниже:
int array[5];
array[20] = 0;
Поскольку вы обращаетесь к памяти, к которой у вас нет доступа (она не была объявлена), вы получите ошибку сегментации. Это также может произойти с утечками памяти, если вы пытаетесь объявлять объекты динамически.
Что именно внутри цикла? Я не совсем уверен, что вызвало бы это, если вы не обращаетесь к какой-то части памяти, к которой у вас нет доступа. Попробуйте запустить отладчик и посмотрите, какая именно строка кода дает сбой.