Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: _16BITGuy_ en 25 de Mayo de 2007, 06:42:55 PM

Título: ¿Alguen sabe a que se debe esto?
Publicado por: _16BITGuy_ en 25 de Mayo de 2007, 06:42:55 PM
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!
Título: ¿Alguen sabe a que se debe esto?
Publicado por: rrbenx en 25 de Mayo de 2007, 08:03:38 PM
Supongo que sea porque camMoves sea de menor tamaño que el que tu quieres, prueba con:

int camMoves[4];
Título: ¿Alguen sabe a que se debe esto?
Publicado por: _16BITGuy_ en 25 de Mayo de 2007, 11:33:33 PM
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
Título: ¿Alguen sabe a que se debe esto?
Publicado por: Hans en 25 de Mayo de 2007, 11:55:51 PM
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.
Título: ¿Alguen sabe a que se debe esto?
Publicado por: _16BITGuy_ en 26 de Mayo de 2007, 01:12:29 AM
que yo sepa, cuando se hace un array camMoves[3], tiene 4 posiciones, el 0 el 1 el 2 y el 3.... me equivoco?
Título: ¿Alguen sabe a que se debe esto?
Publicado por: Zaelsius en 26 de Mayo de 2007, 01:17:11 AM
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 ;)
Título: ¿Alguen sabe a que se debe esto?
Publicado por: ajmendoza en 26 de Mayo de 2007, 01:36:55 AM
Tiene tres, solo q empieza desde el 0, 0, 1 y 2 :)
Título: ¿Alguen sabe a que se debe esto?
Publicado por: Pogacha en 26 de Mayo de 2007, 02:35:15 AM
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!
Título: ¿Alguen sabe a que se debe esto?
Publicado por: Xine en 26 de Mayo de 2007, 04:46:40 AM
que yo sepa es : int variable[n+1];
Título: ¿Alguen sabe a que se debe esto?
Publicado por: _16BITGuy_ en 26 de Mayo de 2007, 11:58:01 AM
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 ;)
Título: ¿Alguen sabe a que se debe esto?
Publicado por: Hans en 26 de Mayo de 2007, 02:06:41 PM
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
Título: ¿Alguen sabe a que se debe esto?
Publicado por: TheAzazel en 26 de Mayo de 2007, 03:45:32 PM
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