[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