27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
1

SDL, surface, font непонятная ошибка

24.11.2011, 23:49. Показов 1854. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Почему-то при вызове следующих функций программа просто вылетает. Вопрос - почему?
Без них утекает ~10-15 мб оперативки ежесекундно. Это понятно почему. Но вылет-то..

C++
1
2
SDL_FreeSurface(textsurf);
TTF_CloseFont(font);
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.11.2011, 23:49
Ответы с готовыми решениями:

Ошибка компиляции CGAL 4.11 - Triangulated Surface Mesh Skeletonization
Добрый день! Добавлено через 19 минут (собственно проблема) При попытке компиляции тестового...

Как вывести текст на экран, используя библиотеку SDL TTF для SDL 2?
В официальной доке как-то скомкано написано. При инициализации SDL TTF и при загрузке шрифта...

Ошибка в приложении sdl
Начинаю разбираться в sdl. Написал фреймворк с графикой. Вижуал студия ошибок не показывает, но при...

SDL ошибка при рендере
Пытаюсь отрендерить картинку через поток -> выдаёт ошибку. Участок кода не может указать, а...

15
Заблокирован
25.11.2011, 00:03 2
Цитата Сообщение от Ksan Посмотреть сообщение
Почему-то при вызове следующих функций программа просто вылетает. Вопрос - почему?
Без них утекает ~10-15 мб оперативки ежесекундно. Это понятно почему. Но вылет-то..

C++
1
2
SDL_FreeSurface(textsurf);
TTF_CloseFont(font);
Информации совершенно недостаточно. Вы даже не потрудились привести объявление этих функций и типы аргументов, которые вы им передаете.

Так что сказать нечего, почему у вас программа вылетает.
0
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
25.11.2011, 00:11  [ТС] 3
C++
1
2
3
4
5
6
7
8
    TTF_Font *font;
    font = TTF_OpenFont("fonts//MINION.ttf", 21);
    SDL_Surface *textsurf;
    SDL_Rect loc = { x, y, 0, 0 };   
    textsurf = TTF_RenderText_Blended(font, text.c_str(), color); 
    SDL_BlitSurface(textsurf, NULL, scr.surf, &loc);
    SDL_FreeSurface(textsurf);
    TTF_CloseFont(font);
этот кусок вызывается порядка 70-100 раз в секунду.
Если закомментить последние 2 строчки, то все работает нормально, только память течет

если же оставить как есть, то программа запускается и буквально тут же вылетает
0
Заблокирован
25.11.2011, 00:19 4
Цитата Сообщение от Ksan Посмотреть сообщение
SDL_BlitSurface(textsurf, NULL, scr.surf, &loc);
Как вы понимаете эту функцию?
Что означают её аргументы? Что куда копируется?
0
Заблокирован
25.11.2011, 00:19 5
Ksan,

Вы проверяли, возвращаемые указатели не равны 0?
0
Заблокирован
25.11.2011, 00:27 6
нужно проверить, завершились ли удачей эти две функции:

Есть подозрение, что:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    TTF_Font *font;   //опасно оставлять не инициализированный указатель
 font = TTF_OpenFont("fonts//MINION.ttf", 21); //вот чему будит равен указатель, 
                             //в случае провала? Вдруг он файла не нашёл.
SDL_Surface *textsurf; //опасно оставлять не инициализированный указатель
SDL_Rect loc = { x, y, 0, 0 }; * 
textsurf = TTF_RenderText_Blended(font, text.c_str(), color);  //чему будит равен указатель, 
                                               //если функция завершилась провалом?
SDL_BlitSurface(textsurf, NULL, scr.surf, &loc); //о возможных проблемах 
          //читаем документацию, или здесь: [url]http://plg.lrn.ru/wiki/SDL_BlitSurface[/url]
SDL_FreeSurface(textsurf);  //подозрение на delete указателя, 
                                             //который так и не был проинициализирован, 
                                              //и содержит мусор (попытка затереть 
                                              //данные по мусорному указателю)
TTF_CloseFont(font);
0
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
25.11.2011, 00:32  [ТС] 7
Bers, поверхность textsurf копируется на scr.surf в область loc.
loc - структура {x, y, w, h}
в данной ф-ции значения w и h ни на что не влияют


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

кстати, если запускать из папки, в которой не работает, то проверка указателей не исправляет проблемы
0
Заблокирован
25.11.2011, 00:36 8
Ksan, скорее всего, у тебя там где то почему то не ходит нужный файл. Шрифт не монтируется, или ещё что то. Кароче, указатели заранее не инициализированные содержат мусор. А потом ты пытаешься этот мусор подзатереть.

Сделай инициализацию указателей нулем в начале. А потом делай проверку, на успех каждой функции
0
Заблокирован
25.11.2011, 00:37 9
Ksan,

Наверное есть же какие-то функции или переменные, которые сообщают об ошибке после вызова той или иной службы? Делайте везде проверки.
0
Заблокирован
25.11.2011, 00:39 10
Цитата Сообщение от Bers Посмотреть сообщение
font = TTF_OpenFont("fonts//MINION.ttf", 21);
Успех этой функции зависит от того, надёт ли функция нужный файл. Путь к файлу относительный.
Может быть здесь то она и спотыкается в зависимости от местонахождения самой программы.

Цитата Сообщение от Ksan Посмотреть сообщение
запускаю из одной папки - не работает
скопипастил в другую папку, запустил - работает

Путь к файлу то относительный прописан. Проверь эту функцию на успешность в той ситуации, когда программа работает, и когда сваливается.
0
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
25.11.2011, 00:46  [ТС] 11
Bers, у меня все нужные файлы правильно лежат. это я проверял


Сыроежка, я пробовал дебаггить таким способом. не помогло

вообщем методом научного тыка смог подобрать правильную комбинацию ф-ций, которая вроде не приводит к вылету программы (нужно подольше потестить, что бы уверенно говорить). НО
меня смущает 1 момент

есть класс button. В нем 4 сурфейса и 1 шрифт
в деструктор класса я прописал освобождение поверхностей и шрифта.
после этого программа стала вылетать.

что меня смущает:

1) переменные глобальные и деструктор как минимум не должен вызываться, ан нет - вызывается как-то и вылетает программа
2) деструктор вызывается, когда переменная уничтожается. значит он должен особождать память. Однако вылет
0
Заблокирован
25.11.2011, 01:06 12
Сыроежка,что меня смущает:

1) переменные глобальные и деструктор как минимум не должен вызываться, ан нет - вызывается как-то и вылетает программа
2) деструктор вызывается, когда переменная уничтожается. значит он должен особождать память. Однако вылет[/QUOTE]

А почему вы решили, что деструкторы для глобальных переменных не вызываются. Они вызываются по завершению работы программы.
0
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
25.11.2011, 01:16  [ТС] 13
Сыроежка, программа вылетает в момент загрузки. Завершать работу она НЕ должна в этот момент.

Почему-то любое освобождение сурфейся(шрифт освобождается нормально Оо) в деструкторе вызывает вылет. При это все равно, локальная переменная или глобальная. Как такое может быть?
0
Заблокирован
25.11.2011, 02:03 14
Цитата Сообщение от Ksan Посмотреть сообщение
Сыроежка, программа вылетает в момент загрузки. Завершать работу она НЕ должна в этот момент.

Почему-то любое освобождение сурфейся(шрифт освобождается нормально Оо) в деструкторе вызывает вылет. При это все равно, локальная переменная или глобальная. Как такое может быть?
Очевидно, этот указатель содержит некорректный адрес. Если вы говорите. что он не равен нулю, то надо его отслеживать. Попробуйте везде распечатывть этот адрес и смотреть, не изменился ли он.

Мне интересно, второй параметр в прототипе функции объявлен как const char * или нет?

C++
1
textsurf = TTF_RenderText_Blended(font, text.c_str(), color);
0
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
25.11.2011, 02:22  [ТС] 15
Сыроежка,

C++
1
2
SDLCALL TTF_RenderText_Blended(TTF_Font *font,
                const char *text, SDL_Color fg);
а что?
0
Заблокирован
25.11.2011, 02:24 16
Ksan,

Я думал, что если не константный указатель, то может быть там она память портит.
0
25.11.2011, 02:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.11.2011, 02:24
Помогаю со студенческими работами здесь

Ошибка в подключении библиотеки SDL
Сделал все как надо,пути указал,файлы в include i lib перенес,сам SDL.dll в папку виндоус перенес...

Ошибка при загрузке шрифта Font Awesome
Здравствуйте, форумчане! Вот такие ошибки возникают, раньше ни разу такого не было, как исправить?...

SDL ошибка на событии обработки нажатия кнопки мыши
Не могу третий день разобраться. Использовал функцию SDL для обработки события нажатия левой кнопки...

Ошибка компилятора gcc при использовании библиотека SDL в C
Здравствуйте. Программа Putpixel, которая строит три вложенных окружности разного цвета: #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru