PDA

Ver la versión completa : Mierda puataaa de C++ y sus structs



Jurk
24/03/2009, 23:45
Bueno, me estoy currando un remake de un juego (es un juego complejo en lo tajante a la logica, pero no en cuanto graficos...) y hay una p*ta estructura o funcion que me da por el p*to an*.




#include "cabeceras.h"
#include "constantes.h"

int x,y;

//estructuras
struct CardSet
{
int ID[NUMEROCARTAS];
char Nombre[NUMEROCARTAS][MAXNOMBRE];
int HP[NUMEROCARTAS];
int SP[NUMEROCARTAS];
int BackUp[NUMEROCARTAS][NUMEROMAXBACKUPS];
int Help[NUMEROCARTAS][NUMEROMAXHELPS];
char Rank[NUMEROCARTAS];
char SpecialAbility[NUMEROCARTAS];
};

//clases
class planos_tapete
{
public:
//funciones publicas
void inicializarTapete()
{
cout << endl;
for (y=0;y<2;y++)
{
for (x=0;x<3;x++)
{
CartaEnTapete[x][y]=0;
}
cout << endl;
}
}
void cogerYPonerCarta()
{
int CardID,jugador,posicion;
cout << " Introduce ID, jugador y posicion: ";
cin >> CardID >> jugador >> posicion;
ponerCarta (CardID, jugador, posicion);
}
void mostrarCartas()
{
for (y=0;y<2;y++)
{
for (x=0;x<3;x++)
{
cout << CartaEnTapete[x][y] << "\t";
}
cout << endl;
}
cout << endl;
}


void inicializarJugadores(int HP1, int HP2, int SP1, int SP2)
{
p1HP=HP1;
p2HP=HP2;
p1SP=SP1;
p2SP=SP2;
}
void mostrarGanador(int ganador)
{
cout << endl << "El ganador es el jugador " << ganador << endl << endl;
}

int checkHP()
{
int ganador;
ganador=0;
if (p1HP <=0) ganador =2;
if (p1HP <=0) ganador =1;
return ganador;

}

private:
//funciones privadas

void ponerCarta( int CardID, int jugador, int posicion)
{
CartaEnTapete[posicion][jugador]=CardID;
}

//varibles privadas de la clase
int CartaEnTapete[3][2];
int p1HP,p2HP,p1SP,p2SP;
};



//funciones
void cargarCartas()
{
for (x=0;x<NUMEROCARTAS;x++)
{
CardSet.ID[x]=x;
}
}
//main
int main()
{
int final=0;
cargarCartas();
planos_tapete tapete;
tapete.inicializarTapete();
tapete.inicializarJugadores(20,20,0,0);

tapete.mostrarCartas();
while (final==0)
{
tapete.cogerYPonerCarta();
tapete.mostrarCartas();
final=tapete.checkHP();
}


system("PAUSE");
return 0;
}


con las siguiente cabeceras... chapuceras...


#ifndef CABECERAS_H
#define CABECERAS_H

#include <cstdlib>
#include <iostream>
#include <ctime>


using namespace std;

#endif



#ifndef CONSTANTES_H
#define CONSTANTES_H

#define CPU 1
#define PLAYER 1
#define NUMEROCARTAS 301
#define NUMEROMAXBACKUPS 10
#define NUMEROMAXHELPS 10
#define MAXNOMBRE 10

#define TRIANG 'A'
#define SQUARE 's'
#define ROUND 'o'

#endif



al intentar compilar todo esto me da un error garrulo:



1>d:\mis documentos\mi c++\fight\fight.cpp(99) : error C2143: error de sintaxis : falta ';' delante de '.'
1>d:\mis documentos\mi c++\fight\fight.cpp(99) : error C2143: error de sintaxis : falta ';' delante de '.'el error no aparece si no esta definida la funcion cargarCartas()...

una manita me hechais???

< - >



Ya lo he solucionado
Gililerdo que soy... al declarar la estructura hay que darle nombre, pero luego hay que dar nombre a la variable.... lerdosoy


asi queda infinitamente mejor:


struct Card
{
int ID;
char Nombre[MAXNOMBRE];
int HP;
int SP;
int BackUp[NUMEROMAXBACKUPS];
int Help[NUMEROMAXHELPS];
char Rank;
char SpecialAbility;
}CardSet[NUMEROCARTAS];

mortimor
24/03/2009, 23:54
Pues... hace mucho que no programo en C++ pero diría que CardSet no esta declarado como variable, es solo una definición de struct. Deberías crear una struct de ese tipo y luego acceder a la misma, creo que con: "struct cardSet {...} CardSet;", sustituyendo los "..." por lo que corresponde en tu código, valdría.

En fins... aunque puede que me equivoque que estoy oxidado con C++ :)

< - >
Upsss llego tarde y sin darme cuenta de que buscabas un array de structs :)

Jurk
24/03/2009, 23:58
tenias razon, mortimor, gracias por la respuesta...

pero ya me lo he solucionado yo mismo... con tu misma solucion, solo que al final lo he modificado pala tener un array de estructuras, no una structura con arrays...

jcom
25/03/2009, 00:01
Una sugerencia, en vez de macros para las constantes, usa const, ya que así el compilador puede hacer verificaciones de tipo.

Jurk
25/03/2009, 00:03
Una sugerencia, en vez de macros para las constantes, usa const, ya que así el compilador puede hacer verificaciones de tipo.

jarl????

explicamelo, que estoy salseando para aprender... que no soy infortamico

entiendo que me recomiendas hacer lo siguiente



#ifndef CONSTANTES_H
#define CONSTANTES_H

const int CPU=1;
const int PLAYER=0;
const int NUMEROCARTAS=301;
const int NUMEROMAXBACKUPS=10;
const int NUMEROMAXHELPS=10;
const int MAXNOMBRE=10;

const int TRIANG='A';
const int SQUARE='s';
const int ROUND='o';

#endif

jcom
25/03/2009, 01:16
jarl????

explicamelo, que estoy salseando para aprender... que no soy infortamico

entiendo que me recomiendas hacer lo siguiente



#ifndef CONSTANTES_H
#define CONSTANTES_H

const int CPU=1;
const int PLAYER=0;
const int NUMEROCARTAS=301;
const int NUMEROMAXBACKUPS=10;
const int NUMEROMAXHELPS=10;
const int MAXNOMBRE=10;

const int TRIANG='A';
const int SQUARE='s';
const int ROUND='o';

#endif

Eso es. Perdón, creí que estabas iniciado. Voy a intentar explicarlo un poco. Con #define lo que se hace es crear una macro para el preprocesador de C++. El preprocesador es un programa que actúa antes que el compilador. Lo que hace con las macros es hacer una sustitución de texto, sin hacer ningún tipo de comprobación. Lo malo es que los mensajes de error causados por un mal uso del preprocesador pueden ser poco claros y te puedes pasar bastante tiempo buscando de dónde vienen.

Algo que me suele pasar a mí con las macros es que pongo un ";" de más:

#define PI 3.14;

Si más adelante en mi programa pongo algo así (imaginemos que r está declarado en otra parte):


float longitud = 2 * PI * r;

lo que le llega al compilador es esto:


float longitud = 2 * 3.14; * r;

lo que produce un error de compilación un tanto confuso.

Jurk
25/03/2009, 22:04
aaa.... era por eso...

Deacuerdo, no estoy totalmente iniciado, pero viendo el codigo que me estoy currando la verdad es que algo si lo esoty :)

Por otra parte, haberme dicho que en vez de defines utilizase consts, tio, que es mas claro. Que para mi los defines son instrucciones de preprocesador, no macros...

aun asi, agradezco tu aclaracion

Seguro que vuelvo a la carga con alguna otra duda tonta... como por que cojones se me van los datos (seran pisadas por alguna otra variable, supongo, aunque no las modifico para nada, solo las leo ?!?) que voy introduciendo en la estructura...

hardyx
25/03/2009, 23:30
Como consejo, ya que utilizas clases no uses la variables x e y como globales, sino declaradas en cada bloque que las use o en cada for. Porque si desde un bucle de estos llamas a una función que use también estas variables puedes tener unos "efectos colaterales" superdivertidos. A lo mejor por eso se te van los datos. Evita en lo posible manipular variables globales en varios sitios y tendrás menos dolores de cabeza.

Para declarar variables locales a un for puedes hacer:

for (int i = 0; i<10; i++)
{
// instrucciones
}

Jurk
26/03/2009, 00:08
Como consejo, ya que utilizas clases no uses la variables x e y como globales, sino declaradas en cada bloque que las use o en cada for. Porque si desde un bucle de estos llamas a una función que use también estas variables puedes tener unos "efectos colaterales" superdivertidos. A lo mejor por eso se te van los datos. Evita en lo posible manipular variables globales en varios sitios y tendrás menos dolores de cabeza.

Para declarar variables locales a un for puedes hacer:

for (int i = 0; i<10; i++)
{
// instrucciones
}

gracias!!

ademas, parece que si pongo la estructura dentro de la clase las cosas van mejor!