Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 5.00
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
24.11.2011, 23:49     SDL, surface, font непонятная ошибка #1
Почему-то при вызове следующих функций программа просто вылетает. Вопрос - почему?
Без них утекает ~10-15 мб оперативки ежесекундно. Это понятно почему. Но вылет-то..

C++
1
2
SDL_FreeSurface(textsurf);
TTF_CloseFont(font);
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.11.2011, 23:49     SDL, surface, font непонятная ошибка
Посмотрите здесь:

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

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

Так что сказать нечего, почему у вас программа вылетает.
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
25.11.2011, 00:11  [ТС]     SDL, surface, font непонятная ошибка #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 строчки, то все работает нормально, только память течет

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

Вы проверяли, возвращаемые указатели не равны 0?
Bers
Заблокирован
25.11.2011, 00:27     SDL, surface, font непонятная ошибка #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);
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
25.11.2011, 00:32  [ТС]     SDL, surface, font непонятная ошибка #7
Bers, поверхность textsurf копируется на scr.surf в область loc.
loc - структура {x, y, w, h}
в данной ф-ции значения w и h ни на что не влияют


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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

C++
1
2
SDLCALL TTF_RenderText_Blended(TTF_Font *font,
                const char *text, SDL_Color fg);
а что?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.11.2011, 02:24     SDL, surface, font непонятная ошибка
Еще ссылки по теме:

Как вывести текст на экран, используя библиотеку SDL TTF для SDL 2? C++
Непонятная ошибка C++
непонятная ошибка C++

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

Или воспользуйтесь поиском по форуму:
Сыроежка
Заблокирован
25.11.2011, 02:24     SDL, surface, font непонятная ошибка #16
Ksan,

Я думал, что если не константный указатель, то может быть там она память портит.
Yandex
Объявления
25.11.2011, 02:24     SDL, surface, font непонятная ошибка
Ответ Создать тему
Опции темы

Текущее время: 18:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru