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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 5.00
Ksan
27 / 27 / 0
Регистрация: 02.11.2010
Сообщений: 370
#1

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

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

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

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

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

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

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

Непонятная ошибка - C++
Здравствуйте, есть задача с графами - соединенные точки и тп, вот попытался сделать структуры и классы для этой задачи и получил ошибку...

Непонятная ошибка - C++
Пробую написать подключаемый модуль к файловому менеджеру ФАР. Программа, не хочет компилится, затсряла на непонятной ошибке Плагин...

Непонятная ошибка - C++
#include <iostream> #include <string> using namespace std; class CMessage { private: char *Text; char...

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

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

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

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


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

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

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

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

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

Путь к файлу то относительный прописан. Проверь эту функцию на успешность в той ситуации, когда программа работает, и когда сваливается.
0
Ksan
27 / 27 / 0
Регистрация: 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
Ksan
27 / 27 / 0
Регистрация: 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
Ksan
27 / 27 / 0
Регистрация: 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.11.2011, 02:22
Привет! Вот еще темы с ответами:

Непонятная ошибка - C++
Здравствуйте, есть код, в котором два раза выполняется одна и та же последовательность, первый раз выполняется без ошибок, во второй раз...

Непонятная ошибка - C++
Здравствуйте!Начинаю изучать C++,хотел сделать калькулятор логики,арифметический и закона Ома. После расчета в любом калькуляторе,кроме...

непонятная ошибка - C++
Почему здесь выбивает ошибку? Помогите последнюю лабу сделать) if (x<(*Node)->l) Add(x,&(*Node)->l); #include <iostream.h> ...

Непонятная ошибка - C++
Мне дана матрица коэффициентов системы линейных уравнений в необычном виде: Исходная СЛУ 4x1 + 2x2 + 9x3 = 1 x2 + 6x3 = 7 4x1 + 2x3...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
25.11.2011, 02:22
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru