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

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

24.11.2011, 23:49. Показов 2078. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru