Groups keyboard shortcuts have been updated
Dismiss
See shortcuts

Extraño fallo de segmentación en SDL_Init

4 views
Skip to first unread message

José Ramón

unread,
Jul 17, 2008, 8:58:39 AM7/17/08
to sdl...@googlegroups.com
Hola a todos. Aunque no soy nuevo en la lista (ya llevo un par de años
creo), sí que es la primera vez que escribo ya que siempre me las he
arreglado con SDL. Sin embargo ahora estoy más atascado que nunca y no
puedo continuar. El problema es el siguiente:
Estoy haciendo una especie de simulador de vuelo (un nombre demasiado
pretencioso para mi proyecto, pero bueno) en C++ con SDL y OpenGL. En el
programa tengo un main muy simple y un montón de clases, como la clase
Juego que es la principal. El main comienza creando (declarando) un
objeto de la clase Juego, y éste comienza en su constructor con un
if(SDL_Init(SDL_VIDEO)<0)...;. Usando el debuger he comprobado que el
llamara al SDL_Init provoca un conocidísimo SIGSEGV, con lo cual, como
el error no se produce en mi código, no tengo ni idea de a que puede ser
debido. La clase Juego tiene bastantes objetos dentro, pero ninguno de
ellos hace llamada alguna a SDL en sus constructores, solo reservan
memoria e inicializan variables, por lo que no deberían dar problemas.
Llevo semanas googleando a ver si a alguien le ha dado un fallo de
segmentación ahí, pero no veo nada. También he descubierto que si
inicializo en el main no me da error eso, pero sí el SDL_SetVideoMode y
si ésta llamada la pongo también en el main, me da error otra llamada
cualquiera de SDL.

Lo más desesperante es que no he hecho nada nuevo con respecto a lo que
ya tenía, y me funcionaba. Solo he añadido una clase Juego que contenga
lo que antes hacía el main, para que éste no sea tan grande y así tener
más organizado el código.

El código no lo he colgado en internet por que el proyecto es para una
asignatura, y no quiero tener problemas de que digan que el código es
copiado. Además que el código donde da el error es muy simple. No
obstante el código lo colgaré en internet bajo GPL para que se haga lo
que se quiera, en cuanto apruebe la asignatura en Septiembre.

El proyecto está creado en Code::Blocks en Ubuntu 8.04, por si sirve de
algo.

Si alguien tiene la menor idea de por qué puede dar este error le estaré
enormemente agradecido.


Unos cachos de código:

int main(int argc, char *argv[]){
Juego juegoDeAviones;
/*El resto del main ni siquiera se llega a ejecutar*/
...
}
//Constructor de la clase Juego:
Juego::Juego(){
//Inicializo los atributos de la pantalla (pantalla es una estructura,
por lo que no influye)
//Posicion
pantalla.x=50;
pantalla.y=50;
//Dimensiones
pantalla.w=1280;
pantalla.h=800;
pantalla.dc=32;
//Inicializar SDL
if(SDL_Init(SDL_INIT_VIDEO)<0) {
//Ni siquiera llega a entrar en el if, ni salir de él
printf("No se puede inicializar SDL");
exit(1);
}
}

PD: Felicitaciones a Hugo Ruscitti y demás creadores de losersjuegos y
gracias a sus ejemplos y tutoriales, que me han enseñado tanto. Y perdon
por un mensaje tan largo para explicar un problema tan corto.

Leandro Ostera

unread,
Jul 17, 2008, 10:24:30 AM7/17/08
to sdl...@googlegroups.com
1) Que funcione.
2) Que funcione bien.
3) Que funcione bien y rapido.

Si esa clase te dió el problema hacé un paso para atras, deja todo andando de vuelta, y volve a hacer la clase (pero guarda una copia de lo que NO funciona, así puedes ver donde estaba el error...que por lo general suelen ser cosas muy simples). Me pasó lo mismo ami hace como 2 años, estuvemás de 3 meses sin poder hacer funcionar lo que ANDABA y no habia agregado nada, al final me decidí por guardar una copia de lo que no andaba y rehacer lo ultimo o lo que creia que no estaba funcinoando y lo solucioné.

No es la forma más practica, claro, pero dado que no tenemos el codigo fuente como para verlo y probarlo, dificilmente encontremos el error (quepuede ser, incluso, que tengas un problema de alocacion de memoria dinamica, que suelen ser comúnes claro).

Bueno, ojalá mi aporte haya sido productivo.

Un abrazo,
Leandro

El día 17/07/08, José Ramón Cano Yribarren <jose...@gmail.com> escribió:



--
Leandro Ostera Villalva
www.elrincondelea.com.ar

José Ramón

unread,
Jul 17, 2008, 3:48:11 PM7/17/08
to sdl...@googlegroups.com
Eso es lo que me temía, tener que rehacerlo. Pero bueno, siempre es
mejor rehacer, por duro que sea, que estar parado. Lo que más me cabrea
es que es un código tan corto (se ejecutan 2 lineas de código efectivas
más constructores que en principio no influyen) que no puedo buscar los
errores.

Ya por curiosidad más que por otra cosa, ¿alguien sabe por que razón
puede provocar un fallo de segmentación la función SDL_Init? ¿No debería
ser lo suficientemente segura como para no provocarlo, aunque no
inicializase? ¿Alguna vez le ha pasado esto a alguien? Mucho me temo que
este caso acabará siendo uno de mis muchos "expedientes X" como
programador.

Muchas gracias por tu ayuda Leandro por abrirme los ojos.

Leandro Ostera

unread,
Jul 17, 2008, 4:26:53 PM7/17/08
to sdl...@googlegroups.com
La verdad que las veces que tuve un SIGSEGV era por alguna tontera y nunca por un problema realmente grave en una funcion como SDL_Init. Te recomendaria que te fijes en los foros/lista de SDL en ingles y revises por algun problema similar (SIGSEGV when calling SDL_init creo que te dará alguna respuesta si buscas). Haz un paso para atras y deja tu codigo andando, y ve haciendo debuggin a cada paso que hagas para rehacer lo ultimo que hiciste (que fué lo que dejó obsoleto tu programa).

Prueba y error, y despues la pregunta.

Siempre funciona.

Un saludo,

lucesita

unread,
Jul 22, 2008, 10:16:29 PM7/22/08
to SDL en Español
Es algo tonto lo que tengo para decir, pero yo en un proyecto dado, en
windows no tiraba ningun error y en ubuntu me tirava SIGSEV
(segmentation fault) este en concreto era, por que cuando creaba unas
Surfaces, no le asiganaba nada, segun lei este error sucede cuando el
programa asigna un puntero a una direccion que pertenece a otro
programa, te repito en windows no me pasaba eso, lo solucione cargando
alguna imagen al surface, tambien probe guardando el valor NULL y
sirve.

asi que prueba eso, si tienes alguna SDL_Surface * o algun puntero,
asignale NULL.

José Ramón

unread,
Jul 23, 2008, 6:59:06 AM7/23/08
to sdl...@googlegroups.com
Sí, a mí tambien me ha pasado eso varias veces (solo que al reves, al
pasar un proyecto de windows que funcionaba a uno en linux que fallaba).
Supongo que será por que linux es bastante más restrictivo y controla
mejor la memoria dinámica.
Pero para este proyecto uso OpenGL, por lo que no uso punteros a
Surface, ni a ningun otro tipo (de hecho el programa falla antes de
crear la ventana). Además, el fallo da al inicializar SDL_Init...

De todas maneras, muchas gracias por las molestias.
Saludos.

Sergio Padrino

unread,
Aug 30, 2008, 3:08:03 PM8/30/08
to SDL en Español
Se me ocurre que pueda ser también que estés usando una DLL que no
corresponda con la biblioteca (.a o .lib, según el compilador) que
estás enlazando. Pasa mucho y si no te das cuenta te puede traer de
cabeza.
No tiene por qué ser la DLL de SDL, puede ser alguna otra que sea
utilizada al inicializar SDL.

Un saludo.

José Ramón

unread,
Aug 31, 2008, 7:34:01 AM8/31/08
to sdl...@googlegroups.com
Mmmm. Es que uso Linux, y todas las librerías que he instalado han sido
con el apt, así que en principio deberían estar bien instaladas y
actualizadas. Como mucho el problema puede estar a la hora de utilizar
librerías "incompatibles", o que se lleven mal, si es que eso existe. De
lo que sí que me dí cuenta es que antes de llamar a SDLInit lo único que
hago es reservar memoria para unos arrays, pero dudo que eso influya en
algo ¿no?.
Al final tuve que rehacer todo el proyecto, clase a clase, como me
sugirieron y ya me funciona. De todas maneras muchas gracias por la
ayuda.

Salu2.

Leandro Ostera

unread,
Aug 31, 2008, 10:17:03 AM8/31/08
to sdl...@googlegroups.com
Congratulaciones

El día 31/08/08, José Ramón Cano Yribarren <jose...@gmail.com> escribió:
Reply all
Reply to author
Forward
0 new messages