C/Visual C - Error con punteros a estructuras

 
Vista:

Error con punteros a estructuras

Publicado por Melina (2 intervenciones) el 20/02/2008 14:09:30
Hola! Yo tengo la siguiente función:

(...)
IngresoBarcosAleatorio(&PtrFirstScreen,&PtrBarco);
IngresoBarcosUsuario(&PtrFirstScreen,&PtrBarco);
TurnoJugada=JugadorInicial(&TurnoJugada);
system("cls");
MostrarPantalla(&PtrFirstScreen);
while(HayJuego((*PtrFirstScreen)->screenpc)==1 && HayJuego(PtrFirstScreen->screenjug)==1)
{
if(TurnoJugada==0)
{
*PtrFirstScreen=TiroUsuario(&PtrFirstScreen);
TurnoJugada=1;
}
(...)
(ese es un fragmento)

En donde está el while, me tira el siguiente error:
94: Pointer to structure required on left side of -> or ->* in function BatallaNaval

La estructura que usa es esta:
struct pantalla
{
int screenjug[10][10];
int screenpc[10][10];
struct pantalla *PtrScreen;
};
typedef struct pantalla Screen;
Screen *PtrFirstScreen=NULL;

Ya probé de colocar cosas como estas que dejo acá, pero no hay caso, y me sigue tirando el mismo error:
HayJuego(PtrFirstScreen->screenpc)
HayJuego(&(PtrFirstScreen->screenpc))

¿Podrían ayudarme? ¡Gracias!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Error con punteros a estructuras

Publicado por Alvaro (122 intervenciones) el 20/02/2008 14:59:07
Primero.

Envía el código, o la definicion de la función HayJuego.
La llamada correcta es HayJuego(PtrFirstScreen->screenpc) ...

Segundo.

¿Estas segura que las llamadas a IngresoBarcoAleatorio, IngresoBarcoUsuario, etc. estan bien?
Resulta que en esos casos estas llamando a las funciones con "la direccion de memoria" de la variable que almacena al puntero...
Yo creo que las llamadas deberían ser así como:

-- IngresoBarcosAleatorio(PtrFirstScreen, PtrBarco);
y la declaración de la funcion:
-- void IngresoBarcosAleatorio( Screen * ptrScreeen, Barco * ptrBarco);


Suerte.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Error con punteros a estructuras

Publicado por Melina (2 intervenciones) el 20/02/2008 15:05:23
Esas están bien porque las funciones llaman con dobles punteros. El problema era lo otro, que al final era error en la función HayJuego:

int HayJuego (int *screen[10][10])
{
int m, w;
for(m=0;m<10;m++)
for(w=0;w<10;w++)
{
if((*screen[m][w])!=1)
return 1;
}
return 0;
}

Yo había puesto eso. Ahora le saqué el puntero y funciona bien.
Te dejo aquí las funciones de IngresoBarcosAleatorio (es una batalla naval lo que estoy haciendo), porque ahora no me quiere crear el ejecutable, y solo tengo este warning:

Warning W8080 batallanaval.c 493: '_getch()' is declared but never used


Funciones:
void IngresoBarcosAleatorio (Screen **P, EnterBoat **Boat)
{
int bcuatro, btres, bdos, buno;
for(bcuatro=0;bcuatro<1;bcuatro++)
{
(*Boat)->longitud=4;
Aleatorio(Boat,P);
}
for(btres=0;btres<=2;btres++)
{
(*Boat)->longitud=3;
Aleatorio(Boat,P);
}
for(bdos=0;bdos<=3;bdos++)
{
(*Boat)->longitud=2;
Aleatorio(Boat,P);
}
for(buno=0;buno<=4;buno++)
{
(*Boat)->longitud=1;
Aleatorio(Boat,P);
}
}

void Aleatorio (EnterBoat **B, Screen **P)
{
int sentido;
randomize();
(*B)->fila=random(10);
(*B)->columna=random(10);
while(validar_coord((*B)->fila,(*B)->columna,(*P)->screenpc)==1)
{
(*B)->fila=random(10);
(*B)->columna=random(10);
}
sentido=random(5);
switch(sentido)
{

case 1: /*izquierda*/
if((*B)->columna!=0 || ((*B)->columna+1)>=(*B)->longitud)
GrabarBarco(B,(*P)->screenpc,sentido);
break;
case 2: /*derecha*/
if((*B)->columna!=9 || ((*B)->columna+(*B)->longitud)<10)
GrabarBarco(B,(*P)->screenpc,sentido);
break;
case 3: /*arriba*/
if((*B)->fila!=0 || ((*B)->fila+1)>=(*B)->longitud)
GrabarBarco(B,(*P)->screenpc,sentido);
break;
case 4: /*abajo*/
if((*B)->fila!=9 || ((*B)->fila+(*B)->longitud)<10)
GrabarBarco(B,(*P)->screenpc,sentido);
break;
}
}

int validar_coord(int fila, int columna, int pantalla[10][10])
{
if(fila<0 || fila>9 || columna<0 || columna>9)
return 1;
else
{
if(pantalla[fila][columna]==1 || pantalla[fila+1][columna]==1 || pantalla[fila-1][columna]==1 || pantalla[fila][columna+1]==1 || pantalla[fila][columna-1]==1)
return 1;
else
return 0;
}
}

void GrabarBarco(EnterBoat **B, int pantalla[10][10], int sent)
{
int fila, columna, w;
fila=(*B)->fila;
columna=(*B)->columna;
switch(sent)
{
case 1: /*izquierda*/
for(w=0;w<(*B)->longitud;w++)
pantalla[fila][columna-w]=1;
case 2: /*derecha*/
for(w=0;w<(*B)->longitud;w++)
pantalla[fila][columna+w]=1;
case 3: /*arriba*/
for(w=0;w<(*B)->longitud;w++)
pantalla[fila-w][columna]=1;
case 4: /*abajo*/
for(w=0;w<(*B)->longitud;w++)
pantalla[fila+w][columna]=1;
}
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar