Problema con struct dentro de libreria

Iniciado por dkmarley, 23 Julio 2010, 15:21 PM

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

dkmarley

Buenas Tardes!!

Bueno os explico mi caso... xD estoy utilizando un puntero hacia una struct en una funcion dentro de una libreria hecha unicamente para la practica que toy haciendo... el caso es que cada vez que uso el puntero me sale un error...

error: invalid use of undefined type 'struct perfiljugador'
error: dereferencing pointer to incomplete type

He estado viendo que puede ser porque la libreria y el main no se encuentra o algo asi... uso netbeans i la verdad que nose donde tendria que hacer la referencia y aque...

<<la funcion dentro de la libreria>>


void CalcularPuntos(struct perfiljugador *players, int n, struct perfiljugador *banca){
   do{
       if((players+n)->jugada > 7.5){
           printf("El %dº jugador se paso y pierde 2p\n",n);
           (players+n)->puntos -= 2;
           printf("Puntuacion total: %d",(players+n)->puntos);
       }else if((players+n)->jugada > banca->jugada){
           printf("El %dº jugador gana a la banca, gana 2p\n");
           (players+n)->puntos += 2;
           printf("Puntuacion total: %d",(players+n)->puntos);
           }
           else {
               printf("La BANCA gana al %dº jugadorn\n",n);
               banca->puntos += 2;
           }
       n--;
   }while(n>0);
}


Solo me sale el error cuando uso el puntero players con banca no tengo ningun problema, el error es el de arriba, uso netbeans por si sirve de algo.. Creo que debe ser una tonteria pero no atino a saber donde deberia hacer la referencia y ¿si fuera algo asi porque con banca no me da problemas? ... y pudiesen ayudar se lo agradeceria..

Saludos y Gracias

cbug

Por favor pon el source completo, y utiliza las etiquetas GeShi.

dkmarley

#2
sobre lo de la etiquetas geshi no tengo ni dea a que te refieres xDD lo siento... os dejo como llamo a la funcion y como declaro la estructura.

#include "lib75.h"

struct perfiljugador{
   float jugada;
   int puntos;
};

dentro del main....

struct perfiljugador *players;

//Reservo memoria segun los jugadores..
players = reservar(j);

CalcularPuntos(players,j-1,&banca); // la banca lo paso asi porque no es puntero

//Funcion para reservar
struct perfiljugador *reservar(int n){
   struct perfiljugador *p;
   p = (struct perfiljugador *) malloc(n*sizeof(p));
   return p;
}

Creo que con esto lo llevas todo ya que lo demas que tengo es para pedir el numero de jugadores y funcion para el aleatorio. Espero haber puesto la informacion necesaria sino aora modifico el post...xD

cbug

Tal vez te ayude esto:

#include <stdio.h>
#include <stdlib.h>

struct perfiljugador{
    float jugada;
    int puntos;
};


struct perfiljugador *reservar(int n){
    struct perfiljugador *p;
    p = (struct perfiljugador *) malloc(n*sizeof(p));
    return p;
}

void CalcularPuntos(struct perfiljugador *, int, struct perfiljugador *);

int main()
{
struct perfiljugador *players;
players = reservar(2);
players[0].jugada = 10.5;
players[0].puntos = 5;
players[1].jugada = 5.1;
players[1].puntos = 3;
printf("\nJugadas>%f\n", players->jugada);
printf("\nPuntos>%d\n", players->puntos);
printf("\nJugadas>%f\n", players[1].jugada);
printf("\nPuntos>%d\n", players[1].puntos);
CalcularPuntos(players, 2, &players[1]);
return 0;
}

void CalcularPuntos(struct perfiljugador *players, int n, struct perfiljugador *banca){
    do{
        if(players[n].jugada > 7.5){
            printf("El %dº jugador se paso y pierde 2p\n",n);
            players[n].puntos -= 2;
            printf("Puntuacion total: %d",players[n].puntos);
        }else if(players[n].jugada > banca->jugada){
            printf("El %dº jugador gana a la banca, gana 2p\n", n);
            players[n].puntos += 2;
            printf("Puntuacion total: %d", players[n].puntos);
            }
            else {
                printf("La BANCA gana al %dº jugadorn\n",n);
                banca->puntos += 2;
            }
        n--;
    }while(n>0);
}


Para utilizar GeShi, encierra el código entre las etiquetas: [code = c] [/code]

dkmarley

Lo siento pero no veo como podria ayudar eso a mi problema ... la distribucion del programa me gusta como esta... la funciones en su libreria y el codigo principal en el main...

He probado a declara la funciones en el main pero aun asi me sigue saliendo los errores ... gracias de todas formas por el aporte y si alguien mas se apunta a comentar se lo agradeceria

Saludos


cbug

#5
Leíste el código? Verás que estás utilizando mal los operadores de acceso a estructura, y al parecer tampoco sabes utilizar tu lista de estructuras... En ningún momento dije que tenías que poner TODO en un solo programa.

Ahora bien, en la función que elaboraste "CalcularPuntos" debes modificar algunas cosas, pero puedes guiarte por como utilizo los accesos a estructuras en main.

Fijate el resultado para que tu función trabaje correctamente:

void CalcularPuntos(struct perfiljugador *players, int n, struct perfiljugador *banca){
    do{
        if(players[n].jugada > 7.5){
            printf("El %dº jugador se paso y pierde 2p\n",n + 1);
            players[n].puntos -= 2;
            printf("Puntuacion total: %d",players[n].puntos);
        }else if(players[n].jugada > banca->jugada){
            printf("El %dº jugador gana a la banca, gana 2p\n", n + 1);
            players[n].puntos += 2;
            printf("Puntuacion total: %d", players[n].puntos);
            }
            else {
                printf("La BANCA gana al %dº jugadorn\n",n);
                banca->puntos += 2;
            }
        n--;
    }while(n>=0); //Acuerdate que se apunta hasta el primer elemento que es 0
}

dkmarley

#6
Buenas!

yo creo que no es por navegar mal dentro de la estructura ya que he realizado practicas similares y no he tenido problemas.. aun asi con tu forma de navegar me sigue saliendo los errores que comente arriba..

gracias por lo del while se me avia pasao xDD ....

cbug

#7
cbug@laptop:~/Desktop gcc p.c
cbug@laptop:~/Desktop$ ./a.out
La BANCA gana al 1º jugadorn
El 1º jugador se paso y pierde 2p


Si pruebas el siguiente programa verás que funciona correctamente:

#include <stdio.h>
#include <stdlib.h>

struct perfiljugador{
   float jugada;
   int puntos;
};


struct perfiljugador *reservar(int n){
   struct perfiljugador *p;
   p = (struct perfiljugador *) malloc(n*sizeof(p));
   return p;
}

void CalcularPuntos(struct perfiljugador *, int, struct perfiljugador *);

int main()
{
struct perfiljugador *players;
players = reservar(2);
players[0].jugada = 10.5;
players[0].puntos = 5;
players[1].jugada = 5.1;
players[1].puntos = 3;
CalcularPuntos(players, 1, &players[0]);
return 0;
}

void CalcularPuntos(struct perfiljugador *players, int n, struct perfiljugador *banca){
   do{
       if(players[n].jugada > 7.5){
           printf("El %dº jugador se paso y pierde 2p\n",n + 1);
           players[n].puntos -= 2;
           printf("Puntuacion total: %d",players[n].puntos);
       }else if(players[n].jugada > banca->jugada){
           printf("El %dº jugador gana a la banca, gana 2p\n", n + 1);
           players[n].puntos += 2;
           printf("Puntuacion total: %d", players[n].puntos);
           }
           else {
               printf("La BANCA gana al %dº jugadorn\n",n);
               banca->puntos += 2;
           }
       n--;
   }while(n>=0);
}


De última, o tienes mal configurado netbeans, o directamente estás haciendo cualquier otra cosa que no podemos estar adivinando pues no ponés tu organización de directorio archivos de cabecera, etc.

PD: Utiliza gcc.

dkmarley

xDD ya esta solucionado, nose si la solucion se puede convertir en un malhabito o algo pero funciona...

el problema es (alomjor no me explique bien) que la declaracion de la estructura esta en el main y la funcion en la libreria aparte entonces es como si no encontrase esa estructura... lo que he hecho es declarar la estructura en el .h.. ¿que te parece esta solucion?

gracias por toda la ayuda

cbug

NetBeans no te da una lista de errores? Seguiría recomendando gcc  :xD
También que directamente utilices [] ya que da una idea más intuitiva de una lista, que un *(puntero + offset).