[U-co] Error: "Fallo de segmentacion" al ejecutar programa con librerias SDL
kuadrosx (Jorge Cuadrado)
kuadrosxx en gmail.com
Mar Ene 27 16:04:46 UTC 2009
On Tue, Jan 27, 2009 at 7:21 AM, Esteban zapata <estebanpunk01 en gmail.com> wrote:
> Hola amigos, como van!
>
> Pues le comento:
> Yo estoy realizando un programa de facturación, un hobbie para
> mantener mis conocimientos al dia. El programa al compilarlo con gcc
> compila normalmente, sin errores, pero al ejecutar el archivo me manda
> un error que dice: "Fallo de Segmentacion"
>
> He buscado en google, tambien he buscado en los man de GCC y el de SDL
> y nada encuentro, que me pueden decir al respecto sobre ese error? si
> pueden proporcionarme una solucion muy amables
> Vale la aclaración que estoy programando en C++, utilizo las librerias
> SDL1.2 y poseo el escritorio KDE 4.1. Tambien he intentado correrlo en
> XFCE4, GNOME y LXDE pero en todos me salen lo mismo, entonces el error
> es del ejecutable o del compilador?
>
> Aca complemento mi codigo:
>
> //Archivos de Cabecera.
> #include<SDL/SDL.h>
> #include<SDL/SDL_image.h>
> #include<SDL/SDL_ttf.h>
> #include<iostream>
> #include<math.h>
> #include<fstream>
>
> //Menus del programa.
> void menu_ppal();
>
> //Variables globales.
>
> SDL_Surface *pantalla;
> SDL_Surface *texto;
> SDL_Event *teclas;
> SDL_Surface *icono;
> SDL_Rect ubicacion;
> SDL_Color color;
>
> using namespace std;
> int main()
> {
> //Colocamos nombre a la pantalla y elegimos el icono.
> SDL_WM_SetCaption("FacLine - Programa de Facturación -", NULL);
> icono = IMG_Load("/home/esteban/Facline/48.png");
> if(icono == NULL)
> {
> cerr << "No se pudo cargar los archivos necesarios..." <<
> SDL_GetError() << endl;
> exit(1);
> }
> SDL_WM_SetIcon(icono, NULL);
>
> //Iniciamos SDL.
> if(SDL_Init(SDL_INIT_VIDEO) < 0)
> {
> cerr << "Error al iniciar SDL, consulte con su
> administrador..." <<
> SDL_GetError() << endl;
> exit(1);
> }
> atexit(SDL_Quit);
>
> //Seleccionamos el modo de video.
> pantalla = SDL_SetVideoMode(700, 520, 24, SDL_ANYFORMAT);
> if(pantalla == NULL)
> {
> cerr << "No se pudo establecer el modo de video..." <<
> SDL_GetError() << endl;
> exit(1);
> }
>
> //Iniciamos el TTf-
> if(TTF_Init() < 0)
> {
> cerr << "Error al inciar las fuentes..." << SDL_GetError() <<
> endl;
> exit(1);
> }
> atexit(TTF_Quit);
> menu_ppal();
> return 0;
> }
>
> //Menu Principal.
> void menu_ppal()
> {
> char x; //Variable de desición.
>
> //"Creamos" la fuente para SDL.
> TTF_Font *fuente;
> fuente = TTF_OpenFont("/home/esteban/Facline/facline.ttf", 40);
> color.r = 255;
> color.g = 255;
> color.b = 255;
> texto = TTF_RenderText_Blended(fuente, "Menu Facturas [F]", color);
> ubicacion.x = 100;
> ubicacion.y = 100;
> SDL_BlitSurface(texto,NULL,pantalla,&ubicacion);
> SDL_Flip(pantalla);
> texto = TTF_RenderText_Blended(fuente, "Menu Clientes [C]", color);
> ubicacion.x += 10;
> ubicacion.y += 10;
> ubicacion.h = texto->h;
> ubicacion.w = texto->w;
> SDL_BlitSurface(texto,NULL,pantalla,&ubicacion);
> SDL_Flip(pantalla);
> }
>
> Gracias a todos por su ayuda!
>
>
> --
> http://mistoffeles.blogspot.com
>
> Software Libre
>
> "Linux es como el mito de la caverna, no conoces la verdad hasta que no te
> desates..."
> --
> Al escribir recuerde observar la etiqueta (normas) de esta lista: http://ur1.ca/0uf7
> Para cambiar su inscripción, vaya a "Cambio de opciones" en http://ur1.ca/0uf9
>
Hola,
Un "Fallo de segmentacion" es el popular NullPointerException para los
que conocen de java. El problema es que estas haciendo una llamada a
un metodo de un puntero nulo. para encontrar el error puedes usar gdb
y obtener el backtrace para ubicar donde esta ese llamado.
ejemplo:
$> gdb exec
$> run
$> bt <-- cuando falle el programa
también usa flags de debug(std::cout << "HERE" ...) para encontrar la
línea exacta del llamado..
aunque no tiene que ver con el problema es mejor usar 0 en lugar de la
macro NULL.
Más información sobre la lista de distribución Ubuntu-co