Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: vib en 14 de Abril de 2013, 12:59:44 AM

Título: Mas errores con libreria TTF de SDL
Publicado por: vib en 14 de Abril de 2013, 12:59:44 AM
Hola buenas!
mirando el foro veo que han salido bastantes problemas con esta libreria pero ninguno se acerca a lo que me pasa ami...

Tengo un problema con la funcion
fuente = TTF_OpenFont("ariblk.ttf", 30);
TTF_CloseFont(fuente);

Nose porque me sucede lo siguiente...El caso esque he implementado una clase Texto, dentro de otra clase y veia que me daba una serie de SEGMENTION FAULTS bueno mucho averiguar he dado con la raiz, pero nose como solucionarlo!


int main()
{
vector<texto>papa;
papa.push_back(texto());
papa.clear();
papa[0]=texto();//una manera probada
papa.push_back(texto());//otra manera

return 0;
}
//contenido clase texto mas significativa
//constructo texto() contiene:
texto::texto()
{
    fuente = TTF_OpenFont("ariblk.ttf", 30);
}
//destructor  texto contiene:
texto::~texto()
{
    TTF_CloseFont(fuente);
   // delete frase;
}

Exactamente eso me pasa...
Lo que realmente quiero hacer es poner en un vector los TEXTOS que vayan a salir en pantalla, luego vacio el vector con clear, y asi infinitamente.
Con este ejemplo de hacer un push_back, clear, push_back
Me da fallo de segmentacion, estoy seguro que es por las funciones mencionadas ya que quitandolas el programa me funciona bien....
Alguna idea? ya que claro esas 2 funciones son clave para mostrar texto con TTF en SDL

Mil gracias!
Título: Re:Mas errores con libreria TTF de SDL
Publicado por: julen26 en 14 de Abril de 2013, 01:13:15 AM
Deberías usar el debugger para dar con el problema exacto. Viendo el código que has puesto diría que salta el "segmentation fault" por intentar acceder a una posición del vector que no existe (papa[0]=texto();) por el hecho de haberlo limpiado antes con clear. Simplemente usa push_back como has hecho o resize para crear elementos nuevos.
Título: Re:Mas errores con libreria TTF de SDL
Publicado por: vib en 14 de Abril de 2013, 01:35:27 AM
Si lo hago con push_back, probe ambas y nada
Ya te digo solo ocurre si dejo las 2 funciones de TTF mencionadas...si las quito y pongo cualquier otra cosa me funciona...
He echo el debug y este es el resultado, aunque no me entero de mucho yo..

#0 0x12d422 __kernel_vsyscall() (??:??)
#1 0x3a5651 raise() (/lib/tls/i686/cmov/libc.so.6:??)
#2 0x3a8a82 abort() (/lib/tls/i686/cmov/libc.so.6:??)
#3 0x3dc49d ??() (/lib/tls/i686/cmov/libc.so.6:??)
#4 0x3e6591 ??() (/lib/tls/i686/cmov/libc.so.6:??)
#5 0x3e7de8 ??() (/lib/tls/i686/cmov/libc.so.6:??)
#6 0x3eaecd free() (/lib/tls/i686/cmov/libc.so.6:??)
#7 0x1c08b5 TTF_CloseFont() (/usr/lib/libSDL_ttf-2.0.so.0:??)
#8 0x8057bc5 texto::descargar(this=0x8180540) (/home/rayos/Escritorio/SCROLL/Libreria_scroll_COPIA_SEGURIDAD_7 (copia)/texto.cpp:39)
#9 0x8057b95 ~texto(this=0x8180540, __in_chrg=<value optimized out>) (/home/rayos/Escritorio/SCROLL/Libreria_scroll_COPIA_SEGURIDAD_7 (copia)/texto.cpp:27)
#10 0x8054e4c std::_Destroy<texto>(__pointer=0x8180540) (/usr/include/c++/4.4/bits/stl_construct.h:83)
#11 0x8054926 std::_Destroy_aux<false>::__destroy<texto*>(__first=0x8180540, __last=0x818056c) (/usr/include/c++/4.4/bits/stl_construct.h:93)
#12 0x8053e55 std::_Destroy<texto*>(__first=0x8180540, __last=0x818056c) (/usr/include/c++/4.4/bits/stl_construct.h:116)
#13 0x8052732 std::_Destroy<texto*, texto>(__first=0x8180540, __last=0x818056c) (/usr/include/c++/4.4/bits/stl_construct.h:142)
#14 0x8053b58 std::vector<texto, std::allocator<texto> >::_M_erase_at_end(this=0xbffff830, __pos=0x8180540) (/usr/include/c++/4.4/bits/stl_vector.h:1150)
#15 0x8052234 std::vector<texto, std::allocator<texto> >::clear(this=0xbffff830) (/usr/include/c++/4.4/bits/stl_vector.h:951)
#16 0x805627a main(argc=1, argv=0xbffff934) (/home/rayos/Escritorio/SCROLL/Libreria_scroll_COPIA_SEGURIDAD_7 (copia)/main.cpp:181)

Título: Re:Mas errores con libreria TTF de SDL
Publicado por: vib en 14 de Abril de 2013, 06:18:48 PM
Solucionado.

Nose porque esta funcion
TTF_CloseFont(fuente);
no me cierra correctamente la fuente y pues me daba esos errores.. lo he corregido poniendo fuente=NULL cuando quiero hacer la descarga de dicho objeto y ya esta.