Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





¿Alguen sabe a que se debe esto?

Iniciado por _16BITGuy_, 25 de Mayo de 2007, 06:42:55 PM

« anterior - próximo »

_16BITGuy_

Hola, buenas.

Estaba programando en vs y me encontre con un fallo un tanto extraño, vereis, tengo este codigo:


#include"cabecero.h"
char BG_PATH[128] = "data\\background\\";

int main(int argc, char *argv[])
{
// Declarando variables necesarias
SDL_Event   event;
SDL_Rect sclView;
int done = 0;
SDL_Surface *bg;
int camMoves[3];

// Configurando CRM32Pro, definiendo titulo de ventana tamaño y
// profundidad de color.
CRM32Pro.Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER);
CRM32Pro.Config.VideoWidth = 640;
CRM32Pro.Config.VideoHeight = 480;
CRM32Pro.Config.VideoBPP = 32;
CRM32Pro.Config.Title = "Naves";
CRM32Pro.SetVideoMode();

// Carga de imagenes
bg = IImage->LoadBMP(strcat(BG_PATH,"cleanspace.bmp"));

   for(int i = 0;i<=3;i++)
{
camMoves[i] = 0;
}

sclView.x = 0; sclView.y = 0;
sclView.w = CRM32Pro.screen->w; sclView.h = CRM32Pro.screen->h;



while(!done)
{
//Leer la entrada de teclado
while(CRM32Pro.Update(&event))
{
 switch(event.type)
 {
      case SDL_QUIT:
         done = 1;
         break;
  case SDL_KEYDOWN:
     if(event.key.keysym.sym == SDLK_ESCAPE) done = 1;
 if(event.key.keysym.sym == SDLK_UP) camMoves[MOVE_U] = 1;
 if(event.key.keysym.sym == SDLK_DOWN) camMoves[MOVE_D] = 1;
 if(event.key.keysym.sym == SDLK_LEFT) camMoves[MOVE_L] = 1;
 if(event.key.keysym.sym == SDLK_RIGHT) camMoves[MOVE_R] = 1;
 break;
  case SDL_KEYUP:
 if(event.key.keysym.sym == SDLK_UP) camMoves[MOVE_U] = 0;
 if(event.key.keysym.sym == SDLK_DOWN) camMoves[MOVE_D] = 0;
 if(event.key.keysym.sym == SDLK_LEFT) camMoves[MOVE_L] = 0;
 if(event.key.keysym.sym == SDLK_RIGHT) camMoves[MOVE_R] = 0;
  default:
                 break;
         }
       }


if(camMoves[MOVE_L])
{
sclView.x -= 2;
}
if(camMoves[MOVE_R])
{
sclView.x += 2;
}
if(camMoves[MOVE_U])
{
sclView.y -= 2;
}
if(camMoves[MOVE_D])
{
sclView.y += 2;
}

scroll(bg,&sclView);
}
SDL_FreeSurface(bg);
CRM32Pro.Quit();
return 0;
}

Pues resulta que al compilar todo va bien, el programa funciona bien, pero al cerrarlo sale este error:

Run-Time Check Failure #2 - Stack around the variable 'camMoves' was corrupted.

No se por que ocurre esto, luego probe a compilar este mismo codigo en DevC++ (MinGW), y no ocurre nada malo.

¿Alguen sabe por que?

Un Saludo!

rrbenx

Supongo que sea porque camMoves sea de menor tamaño que el que tu quieres, prueba con:

int camMoves[4];
Tap or Die Juego Android Gratis!!
Dungeon break Juego Android Gratis!!
Organic Software
Blog

_16BITGuy_

pues no, solo se usan los campos 0 1 2 y 3 de camMoves, si fuera fallo de eso, se me pararia el programa antes de que lo cerrara en el momento en que llegase al fragmento de codigo, pero mientras el programa se ejecuta va bien, excepto al cerrar

Hans

Defines camMoves como un array de 3 posiciones pero accedes a 4 y los inicializas a 0. Lo he mirado muy por encima porque tengo un sueño que me muero pero eso está mal seguro.

_16BITGuy_

que yo sepa, cuando se hace un array camMoves[3], tiene 4 posiciones, el 0 el 1 el 2 y el 3.... me equivoco?

Zaelsius

Cita de: "_16BITGuy_"cuando se hace un array camMoves[3], tiene 4 posiciones, el 0 el 1 el 2 y el 3.... me equivoco?


PD: Que sí, que te equivocas ;)

ajmendoza

Tiene tres, solo q empieza desde el 0, 0, 1 y 2 :)

Pogacha

El C y C++ tienen arreglos basados en indice 0, otros lenguajes como el pascal empiezan en 1.

char a[3] = { 0, 1, 2 };
assert( a[0] == 0 && a[1] == 1 && a[2] ==2 );

OT: en el unico momento de mi vida que senti esta diferencia fue cuando tuve que implementar un heap por primera vez halla en mis inicios.

Saludos!

Xine


_16BITGuy_

hmmm, pues si es vedad que es asi ahora que recuerdo,toi mirando mis primeros codigos y lo hacia asi, pero si es asi ¿por que leches me ha estado funcionando esto perfectamente con el compilador MinGW?, en la mayoria de las cosas ahora que estoy viendo mis codigos, lo he hecho asi y solo se quejaba si por ejemplo, hacias un int miarray[4] miarray[5] = 1 o algo asi, o en los caracteres si no tenias en cuenta el caracter nulo. Eso de que en uno falle y en otro no es un tostonazo por que te equivocas luego te funciona y te lo crees que es asi, enfin gracias por aclararme la duda ;)

Hans

Cita de: "_16BITGuy_"hmmm, pues si es vedad que es asi ahora que recuerdo,toi mirando mis primeros codigos y lo hacia asi, pero si es asi ¿por que leches me ha estado funcionando esto perfectamente con el compilador MinGW?, en la mayoria de las cosas ahora que estoy viendo mis codigos, lo he hecho asi y solo se quejaba si por ejemplo, hacias un int miarray[4] miarray[5] = 1 o algo asi, o en los caracteres si no tenias en cuenta el caracter nulo. Eso de que en uno falle y en otro no es un tostonazo por que te equivocas luego te funciona y te lo crees que es asi, enfin gracias por aclararme la duda ;)


Pasa a veces y a veces no por el simple hecho de que en algunos casos da la casualidad de que no sobrescribes valores de otras variables y en otros casos sí. Todo depende de la suerte :D

TheAzazel

Donde te estaba dando el cante era aqui:

for(int i = 0;i<=3;i++)
  {
     camMoves = 0;
  }

ese menor o igual que hace que con i=3 tambien lo asigne y por tanto se sale del rango y pisa algo.

El visual studio estas cosas las suele pillar en modo debug(si compilas en release quizas no te de ningun cante ya veras), de todos modos yo me he encontrado con casos opuestos... el gnu gcc de linux me ha dado el cante por algo que se ha comido el vstudio, asi que... unos compiladores ven unas cosas y otros...otras :)

Resumiendo, al definir el array, el numero que le indicas es el numero de elementos del array pero para acceder a el tienes que tener cuidado que empieza en 0.

Uhmm...repasate un poco las cosas de C para refrescar estos conceptos, te ahorraran muchos disgutos despues :)

Saludos






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.