Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370

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

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

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

C++
1
2
SDL_FreeSurface(textsurf);
TTF_CloseFont(font);
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.11.2011, 23:49
Ответы с готовыми решениями:

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

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

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

15
Заблокирован
25.11.2011, 00:03
Цитата Сообщение от 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  [ТС]
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
Цитата Сообщение от Ksan Посмотреть сообщение
SDL_BlitSurface(textsurf, NULL, scr.surf, &loc);
Как вы понимаете эту функцию?
Что означают её аргументы? Что куда копируется?
0
Заблокирован
25.11.2011, 00:19
Ksan,

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

Есть подозрение, что:
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  [ТС]
Bers, поверхность textsurf копируется на scr.surf в область loc.
loc - структура {x, y, w, h}
в данной ф-ции значения w и h ни на что не влияют


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

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

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

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

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

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


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

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

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

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

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

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

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

Почему-то любое освобождение сурфейся(шрифт освобождается нормально Оо) в деструкторе вызывает вылет. При это все равно, локальная переменная или глобальная. Как такое может быть?
0
Заблокирован
25.11.2011, 02:03
Цитата Сообщение от 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  [ТС]
Сыроежка,

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

Я думал, что если не константный указатель, то может быть там она память портит.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.11.2011, 02:24
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Чистый C и C++ в Qt Creator: ставим среду без VPN и настраиваем MinGW/CMake, без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru