c++ SDL error del compilador

Consulte acerca de programas, técnicas, algoritmos etc.

c++ SDL error del compilador

Notapor samu_dnet » Sab Feb 21, 2009 3:40 am

Hola estaba mirando un tutorial de sdl que ponia que era para c++ pero al principio resulta que te ponen el codigo en c y dicen la propuesta de pasarlo a c++, y eso e intentado y en 4 con exito pero el 5 me da un error que no comprendo!
este es el codigo:
Código: Seleccionar todo
#include "programa.hpp"
#include <iostream>
#include <SDL/SDL.h>
#include <stdio.h>
using namespace std;

void compatibilidad_video_sdl(int w, int h, int bpp);
void sdl_videoinfo();
void datos_configuracion(int *w,int *h,int *bpp);

int main()
{
   int opcion;
   int w, h, bpp;
   atexit(SDL_Quit);
   do
   {
      if (SDL_Init(SDL_INIT_VIDEO) < 0)
      {
         cerr << "NO SE PUEDE INICIAR EL SDL VIDEO: "<<SDL_GetError()<<endl;
         return -1;
      }
      cout<<endl;
      cout<<"1-Compatibilidad Del Video SDL."<<endl;
      cout<<"2-Informacion SDL_Video_info."<<endl;
      cout<<"3-Salir."<<endl;
      (int)cin.get();
      switch (opcion)
      {
         case 1:
            datos_configuracion(&h, &w, &bpp);
            compatibilidad_video_sdl (w,h,bpp);
            SDL_Quit();
            break;
         case 2:
            sdl_video_info ();
            SDL_Quit();
            break;
         case 3:
            SDL_Quit();
            break;
         default:
         cout <<endl<<"Opcion no valida"<<endl;
      }   
   }
   while (opcion != 3);
      
      cout << endl<<"OK"<<endl;
      return 0;
}
void compatibilidad_video_sdl(int w, int h, int bpp)
{
   SDL_Surface *pantalla;
//SWSURFACE    superficie en la memoria principal (por software)
   pantalla = SDL_SetVideoMode(w, h, bpp, SDL_SWSURFACE);
   if (pantalla == NULL)
   {
      cout <<" SDL_SWSURFACE hwbpp: "<<h<<" "<<w<<" "<<bpp<<" No compatible, El error es: "<<SDL_GetError()<<endl;
   }
   else
   {
      cout <<" SDL_SWSURFACE hwbpp: "<<h<<" "<<w<<" "<<bpp<<" Es compatible"<<endl;
   }
   
   
//HWSURFACE    superficie en la memoria de la gpu (hardware)
   pantalla = SDL_SetVideoMode(w, h, bpp, SDL_HWSURFACE);
   if (pantalla == NULL)
   {
      cout <<" SDL_HWSURFACE hwbpp: "<<h<<" "<<w<<" "<<bpp<<" No compatible, El error es: "<<SDL_GetError()<<endl;
   }
   else
   {
      cout <<" SDL_HWSURFACE hwbpp: "<<h<<" "<<w<<" "<<bpp<<" Es compatible"<<endl;
   }

   
//HWSURFACE+DOUBLEBUFFER
   pantalla = SDL_SetVideoMode(w, h, bpp, SDL_HWSURFACE | SDL_DOUBLEBUF);
   if (pantalla == NULL)
   {
      cout <<" SDL_HWSURFACE con SDL_DOUBLEBUF hwbpp: "<<h<<" "<<w<<" "<<bpp<<" No compatible, El error es: "<<SDL_GetError()<<endl;
   }
   else
   {
      cout <<" SDL_HWSURFACE con SDL_DOUBLEBUF hwbpp: "<<h<<" "<<w<<" "<<bpp<<" Es compatible"<<endl;
   }

   
//SDL_ASYNCBLIT       Especial para Multiprocesadores
   pantalla = SDL_SetVideoMode(w, h, bpp, SDL_ASYNCBLIT);
   if (pantalla == NULL)
   {
      cout <<" SDL_ASYNCBLIT hwbpp: "<<h<<" "<<w<<" "<<bpp<<" No compatible, El error es: "<<SDL_GetError()<<endl;
   }
   else
   {
      cout <<" SDL_ASYNCBLIT hwbpp: "<<h<<" "<<w<<" "<<bpp<<" Es compatible"<<endl;
   }

   
//SDL_ANYFORMAT    Forzar bbp en modo ventana
   pantalla = SDL_SetVideoMode(w, h, bpp, SDL_ANYFORMAT);
   if (pantalla == NULL)
   {
      cout <<" SDL_ANYFORMAT hwbpp: "<<h<<" "<<w<<" "<<bpp<<" No compatible, El error es: "<<SDL_GetError()<<endl;
   }
   else
   {
      cout <<" SDL_ANYFORMAT hwbpp: "<<h<<" "<<w<<" "<<bpp<<" Es compatible"<<endl;
   }

   
//SDL_HWPALETTE    acceso exclusivo paleta de color
   pantalla = SDL_SetVideoMode(w, h, bpp, SDL_HWPALETTE);
   if (pantalla == NULL)
   {
      cout <<" SDL_HWPALETTE hwbpp: "<<h<<" "<<w<<" "<<bpp<<" No compatible, El error es: "<<SDL_GetError()<<endl;
   }
   else
   {
      cout <<" SDL_HWPALETTE hwbpp: "<<h<<" "<<w<<" "<<bpp<<" Es compatible"<<endl;
   }

   
//SDL_OPENGLBLIT     permite renderizado opengl
   pantalla = SDL_SetVideoMode(w, h, bpp, SDL_OPENGLBLIT);
   if (pantalla == NULL)
   {
      cout <<" SDL_OPENGLBLIT hwbpp: "<<h<<" "<<w<<" "<<bpp<<" No compatible, El error es: "<<SDL_GetError()<<endl;
   }
   else
   {
      cout <<" SDL_OPENGLBLIT hwbpp: "<<h<<" "<<w<<" "<<bpp<<" Es compatible"<<endl;
   }

   
//SDL_RESIZABLE      permite a la aplicacion redimensionar la superficie
      pantalla = SDL_SetVideoMode(w, h, bpp, SDL_RESIZABLE);
   if (pantalla == NULL)
   {
      cout <<" SDL_RESIZABLE hwbpp: "<<h<<" "<<w<<" "<<bpp<<" No compatible, El error es: "<<SDL_GetError()<<endl;
   }
   else
   {
      cout <<" SDL_RESIZABLE hwbpp: "<<h<<" "<<w<<" "<<bpp<<" Es compatible"<<endl;
   }

   
//SDL_NOFRAME
   pantalla = SDL_SetVideoMode(w, h, bpp, SDL_NOFRAME);
   if (pantalla == NULL)
   {
      cout <<" SDL_NOFRAME hwbpp: "<<h<<" "<<w<<" "<<bpp<<" No compatible, El error es: "<<SDL_GetError()<<endl;
   }
   else
   {
      cout <<" SDL_NOFRAME hwbpp: "<<h<<" "<<w<<" "<<bpp<<" Es compatible"<<endl;
   }
//SDL_FULLSCREEN
   pantalla = SDL_SetVideoMode(w, h, bpp, SDL_FULLSCREEN);
   if (pantalla == NULL)
   {
      cout <<" SDL_FULLSCREEN hwbpp: "<<h<<" "<<w<<" "<<bpp<<" No compatible, El error es: "<<SDL_GetError()<<endl;
   }
   else
   {
      cout <<" SDL_FULLSCREEN hwbpp: "<<h<<" "<<w<<" "<<bpp<<" Es compatible"<<endl;
   }
}
void sdl_videoinfo()
{
   const SDL_VideoInfo *propiedades;
   SDL_Surface *superficie;
   SDL_Rect **modos;
   
   //variables auxiliares
   char driver[20];
   int maxlon = 20;
   propiedades = SDL_GetVideoInfo();
   if (propiedades == NULL)
   {
      cerr << endl<<"ERROR no se puede obtener la informacion de la gpu"<<endl;
   }
   modos = SDL_ListModes(NULL,SDL_HWSURFACE);
   
   cout <<endl<<"     == MODOS DE VIDEO DISPONIBLES ==      "<<endl;
   if (modos == (SDL_Rect **)0)
   {
      cerr << endl<<" NO EXISTEN MODOS DISPONIBLES!!!"<<endl;
   }
   else if (modos == (SDL_Rect **)-1)
   {
      cout <<endl<<" TODOS LOS MODOS DISPONIBLES "<<endl;
   }
   else
   {
      cout <<endl<< "MODOS DISPONIBLES:  "<<endl;
      for (int i = 0;modos[i];i++)
      {
         cout << modos[i] -> w <<" x " <<modos[i] -> h<<endl;
      }
   }
   // vamos a comprobar que el modo esta ok
   if (SDL_VideoModeOK(1280, 1024, 32, SDL_HWSURFACE)== 0)
   {
      cerr << "HWSURFACE 1280 x 1024 32bits no compatible ERROR: " <<SDL_GetError()<<endl;
   }
   
   superficie = SDL_SetVideoMode(1280, 1024, 32, SDL_HWSURFACE);
   if (superficie == NULL)
   {
      cerr << "ERROR AL ASIGNAR EL MODO DE VIDEO: " << SDL_GetError()<<endl;
   }
   
   cout <<endl<<endl<<"  DRIVER OBTENIDO  "<<endl;
   SDL_VideoDriverName(driver,maxlon);
   if (driver == NULL)
   {
      cerr << "ERROR AL OBTENER EL NOMBRE DEL DRIVER "<< SDL_GetError()<<endl;
   }
   cout <<driver<<endl;
   
   cout <<endl<<endl<< "   == INFORMACION DE SDL_INFO =="<<endl;
   if(propiedades->hw_available == 1)
   {
      cout << "HW COMPATIBLE"<<endl;
   }
   else
   {
      cout << "HW NO COMPATIBLE"<<endl;
   }
   if(propiedades->wm_available == 1)
   {
      cout << "HAY UN MANEJADOR DE VENTANAS"<<endl;
   }
   else
   {
      cout << "NO HAY GESTOR DE VENTANAS"<<endl;
   }
   if(propiedades->blit_hw == 1)
   {
      cout << "EL BLIT POR HW ESTA ACCELERADO"<<endl;
   }
   else
   {
      cout << "EL BLIT POR HW NO ESTA HABLITADO"<<endl;
   }
   if(propiedades->blit_hw_CC == 1)
   {
      cout << "EL BLIT CON TRANSPARENCIA POR HW ESTA ACCELERADO"<<endl;
   }
   else
   {
      cout << "EL BLIT CON TRANSPARENCIAS NO ESTA ACCELERADO"<<endl;
   }
   if(propiedades->blit_sw == 1)
   {
      cout << "BLIT SOFT. ESTA ACCELERADO"<<endl;
   }
   else
   {
      cout << "BLIT SOFT. NO ESTA ACCELERADO"<<endl;
   }
   if(propiedades->blit_fill == 1)
   {
      cout << "EL BLIT DE RELLENO ESTA ACCELERADO"<<endl;
   }
   else
   {
      cout << "BLIT DE RELLENO NO ACCELERADO"<<endl;
   }
      if(propiedades->blit_sw_A == 1)
   {
      cout << "BLIT SOFT. CON ALPHA ESTA ACCELERADO"<<endl;
   }
   else
   {
      cout << "BLIT SOFT. CON ALPHA NO ESTA ACCELERADO"<<endl;
   }
   cout << "La memoria de video tiene: "<<(float)propiedades->video_mem<<endl;
      
}

void datos_configuracion(int *w,int *h,int *bpp)
{
   cout << endl<<"Introduce la anchura de la pantalla en pixels:  ";
   scanf("%d",w);   
   cout << endl<<"Introduce la altura de la pantalla en pixels:  ";
   scanf("%d",h);
   
   cout << endl<<"Introduce la profundidad del color:  ";
   scanf("%d",bpp);
   cout <<endl;
}


AYUDA PORFAVOORR!! xD

el error del compilador:
samuel@desktop:~/Projectos/Anjuta/SDLPRIMER/src$ g++ programa.cpp -o samu `sdl-config --cflags --libs --static-libs`
/tmp/ccsoJbff.o: In function `main':
programa.cpp:(.text+0x128f): undefined reference to `sdl_video_info()'
collect2: ld devolvió el estado de salida 1
samu_dnet
 
Mensajes: 6
Registrado: Sab Feb 21, 2009 3:37 am

Notapor Juanxo » Dom Feb 22, 2009 3:21 am

Buenas!
Yo no conozco el lenguaje demasiado, pero mirando un poco parece que llamas a un metodo sdl_videoinfo()(linea 7) y despues lo referencias como sdl_video_info()(linea 28), por lo que el compilador te dice que no conoce nada llamado sdl_video_info() con lo que trabajar.
Prueba a cambiar eso.

Espero haber acertado. :lol:
Avatar de Usuario
Juanxo
 
Mensajes: 437
Registrado: Sab Ene 31, 2009 2:34 am
Ubicación: Madrid(España)

Notapor sofoke » Dom Feb 22, 2009 5:46 am

es que haces esta llamada:
Código: Seleccionar todo
sdl_video_info ();

en vez de algo asi:
Código: Seleccionar todo
sdl_videoinfo ();

Segun lo que pude ver ese es el error...
...cuando lo popular no es suficiente...
Gnu-Linux-y-Más
Avatar de Usuario
sofoke
 
Mensajes: 102
Registrado: Jue May 24, 2007 8:10 pm
Ubicación: México

Notapor samu_dnet » Dom Feb 22, 2009 1:55 pm

Les agradezco mucho la ayuda!!! ahora si me compila bien!!,

ahora tengo un pequeñito problemilla ( Yo creo que el ultimo ;-P).
En las ultimas lineas esta la funcion datos_configuracion(...)
e transformado los scanf, en cin de c++ (antes no me acordaba de como se hacia) y asi evito tener que poner la biblioteca stdio.h.
pero tengo el mismo error, el codigo me queda asi ahora:

Código: Seleccionar todo
void datos_configuracion(int *w,int *h,int *bpp)
{
   cout << endl<<"Introduce la anchura de la pantalla en pixels:  ";
   w = (int*)cin.get();
   cout << endl<<"Introduce la altura de la pantalla en pixels:  ";
   h = (int*)cin.get();
   
   cout << endl<<"Introduce la profundidad del color:  ";
   bpp = (int*)cin.get();
   cout <<endl;
}

cuando ejecuto el programa, si elijo cualquier opcion siempre me sale esto:
//(el bucle switch esta en el primer post en main())

samuel@desktop:~/Projectos/Anjuta/SDLPRIMER/src$ ./samu

1-Compatibilidad Del Video SDL.
2-Informacion SDL_Videoinfo.
3-Salir.
1

Opcion no valida

1-Compatibilidad Del Video SDL.
2-Informacion SDL_Videoinfo.
3-Salir.

Opcion no valida

1-Compatibilidad Del Video SDL.
2-Informacion SDL_Videoinfo.
3-Salir.

sale dos veces el menu que hice, eso supongo que quiere decir que corre dos veces el bloque switch aunque supongo que el error es que cuando se hace cin.get() te lee un caracter en vez de convertirlo al numero.
Les Agradezco muchisimo la ayuda.
Un saludo SAMUEL.
samu_dnet
 
Mensajes: 6
Registrado: Sab Feb 21, 2009 3:37 am

Notapor Juanxo » Dom Feb 22, 2009 3:09 pm

Buenas Samu!

Tu problemilla viene,creo yo, debido a que en ningún momento relacionas el número obtenido por el cin.get() con la variable opción.

No se si se hace así exactamente, pero podrías probar a poner algo del estilo de:

Código: Seleccionar todo
cin>>opcion;
Avatar de Usuario
Juanxo
 
Mensajes: 437
Registrado: Sab Ene 31, 2009 2:34 am
Ubicación: Madrid(España)

Notapor samu_dnet » Dom Feb 22, 2009 8:30 pm

Dios santo que error mas tonto :oops: :
Ademas de que este ultimo codigo no tenia nada que ver (me he dado cuenta al decirme lo de la variable opcion,
ademas estaba mal, exactamente havia que hacer lo que tu decias:
cin >> opcion;
y en codigo que puse era cin >> *w;
MUCHISIMAS GRACIAS !!! ahora todo perfecto!!!!
samu_dnet
 
Mensajes: 6
Registrado: Sab Feb 21, 2009 3:37 am


Volver a General

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados

cron