error en bucle[codigo fuente]

Iniciado por bash, 4 Noviembre 2015, 16:34 PM

0 Miembros y 1 Visitante están viendo este tema.

bash

Buenas a todos !!
he estado programando un aplicacion mobil usando sdl y cuando cargo para probar
me da errores  la verdad tengo un buen tiempo y no doy con lo que me causa problema.

mas abajo dejo el codigo , aunque estoy pensando que es por un bucle que tengo pero no estoy seguro
Código (cpp) [Seleccionar]




#include<SDL.h>

#include<cstdlib>
#include<ctime>

using namespace std;


void CopiarPantalla(SDL_Renderer *renderer, SDL_Rect start_pos[256],SDL_Texture *img)
{
  for(unsigned int Drawers = 0; Drawers <255; Drawers++)
  {
  SDL_RenderCopy(renderer, img,NULL,&start_pos[Drawers]);
  }


}


int main(int argc, char *argv[])
{

SDL_Rect player = {10,12,32,32};


SDL_Window     *window    =  NULL;
SDL_Renderer   *renderer  =  NULL;
int width     =  0 ;
int height  =  0 ;
   bool Run  =  true;
   SDL_Surface    *unloaded  =  NULL;
SDL_Surface    *opt_img  =  NULL;
SDL_Texture    *img  =  NULL;
   SDL_Event    event;
SDL_DisplayMode mode;
unsigned int start = 0;
SDL_Rect start_pos[256];
SDL_Color color_pantalla = {0,0x12,0xa,0xff};
SDL_Rect fillRect;

if(SDL_Init(SDL_INIT_EVERYTHING) < 0 )
{
SDL_Log("Imposible Cargar SDL_INIT [%s]", SDL_GetError());
   Run    = false;
}
srand(time(NULL));
for(unsigned int initializer = 0; initializer <255; initializer++)
{
start_pos[initializer].x = 10 + rand() % width;
       start_pos[initializer].y = 10 + rand() % height;
       start_pos[initializer].w = 32;
   start_pos[initializer].h = 32;
}

unloaded = SDL_LoadBMP("color.bmp");
if(unloaded == NULL)
{
SDL_Log("No se cargo el graficio");
   Run = false;
}
else
{

opt_img =  SDL_ConvertSurfaceFormat( unloaded, SDL_PIXELFORMAT_RGBA8888, NULL );
if(opt_img == NULL)
{
SDL_Log("Imposible optimizar");
Run = false;
}
}


if(Run == true)
{




//obtner el tamano de los valores de la pantalla.
if( SDL_GetCurrentDisplayMode( 0, &mode ) == 0 )
     {
width   = mode.w;
height  = mode.h;
fillRect.w = width;
fillRect.h = height;
player.x = width /2;
player.y = height/2;
 }


//crear la ventana SDL
window = SDL_CreateWindow("Neo.App",SDL_WINDOWPOS_UNDEFINED,SDL_WINDOWPOS_UNDEFINED,width, height, SDL_WINDOW_SHOWN);
    if(window == NULL)
{
SDL_Log("Imposible crear la ventana ,[%s]", SDL_GetError());
    Run = false;
}
else
{
Run = true;
    }
    if(Run == true)
{
renderer = SDL_CreateRenderer(window , -1 ,  SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
if(renderer == NULL)
{
Run = false;
}
}
///Creamo la textura aqui.
SDL_SetColorKey(opt_img, SDL_TRUE, SDL_MapRGB(opt_img->format, 0,0,0));


img = SDL_CreateTextureFromSurface( renderer, opt_img);















///bucle principal.
while(Run)
{
start = SDL_GetTicks();
///pollEvent's
while(SDL_PollEvent(&event))
{
if(event.type == SDL_QUIT)
{
Run = false;
#ifdef _DEBUG_ENABLE
 SDL_Log("se acabo");
#endif
}
if(event.type == SDL_KEYDOWN ||  event.type == SDL_FINGERDOWN)
            {
if(event.type == SDL_FINGERDOWN)
{
color_pantalla.g +=32 ;
if(color_pantalla.g == 256)
{
            color_pantalla.g = 0;
       color_pantalla.r += 32;
color_pantalla.b += 64;
if(color_pantalla.r == 256)
color_pantalla.r = 0;
if(color_pantalla.b == 256)
color_pantalla.b = 0;
}
}



}







}//end event;


//update
   for(unsigned int initializer = 0; initializer <255; initializer++)
{
start_pos[initializer].x = 10 + rand() % width;
       start_pos[initializer].y = 10 + rand() % height;
       start_pos[initializer].w = 32;
   start_pos[initializer].h = 32;
}










//Draw
 SDL_RenderClear(renderer);
 SDL_SetRenderDrawColor( renderer, color_pantalla.r, color_pantalla.g, color_pantalla.b, color_pantalla.a);        
         SDL_RenderFillRect( renderer, &fillRect );
     CopiarPantalla(renderer,start_pos,img);
 
 SDL_RenderCopy(renderer, img,NULL,&player);

SDL_RenderPresent(renderer);

//FPS
}




}

return 0;
}




pienso que el error puede estar la funcion copiar.. pero no estoy seguro. por cierto en Desktop cuando la corro la aplicacion cierra desde que entra al primer for , pero en mobil es diferente y es confuso.

gracias
gracias por responder mis dudas

ivancea96

¿Qué errores te dá?
No pretendas poner un código de 200 líneas y que tengamos más idea de él que tú :/
Ve punto a punto revisando qué es correcto. Localiza la línea en que ves el fallo. Fíjate en las variables que intervienen en el fallo, y mira cuál es incorrecta o cual podría provocar el fallo.

Si encuentras una variable, simplemente localiza donde le das el valor, y busca el problema.

Avanza, y nos comentas.

bash

#2
disculpa , el unico error que me da es que la aplicacion cae, he estado despurando y cada vez que entro en el for de la linea 14 la aplicacion falla.

pienso que es por que esta dentro de un bucle while , pero por que justamente ahi?
por cierto la declaracioon de un SDL_Rect start[256]  podria darme problema siendo una struct arreglo de 256 campos?




--------------------------------------------------------------------------------------------
el problema es el for dentro del bucle while cada vez que llamo a la funcion CopiarPantalla
la aplicacion se cierra.

la pregunta es como podria hacer para usar los 256 elementos de esa struct?
gracias por responder mis dudas

ivancea96

En los for pones:
Código (cpp) [Seleccionar]
for(unsigned int initializer = 0; initializer <255; initializer++)

<255. Si tiene 256 elementos, y los quieres recorrer todos, has de poner <256. Si pones <255 vas a recorrer hasta el elemento 255, de índice 254.

Por lo demás, sigue buscando qué pueda fallar.