Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: dkmarley en 23 Julio 2010, 15:21 pm



Título: Problema con struct dentro de libreria
Publicado por: dkmarley en 23 Julio 2010, 15:21 pm
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>>

Código:
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


Título: Re: Problema con struct dentro de libreria
Publicado por: cbug en 23 Julio 2010, 15:34 pm
Por favor pon el source completo, y utiliza las etiquetas GeShi.


Título: Re: Problema con struct dentro de libreria
Publicado por: dkmarley en 23 Julio 2010, 15:43 pm
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


Título: Re: Problema con struct dentro de libreria
Publicado por: cbug en 23 Julio 2010, 16:06 pm
Tal vez te ayude esto:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. struct perfiljugador{
  5.    float jugada;
  6.    int puntos;
  7. };
  8.  
  9.  
  10. struct perfiljugador *reservar(int n){
  11.    struct perfiljugador *p;
  12.    p = (struct perfiljugador *) malloc(n*sizeof(p));
  13.    return p;
  14. }
  15.  
  16. void CalcularPuntos(struct perfiljugador *, int, struct perfiljugador *);
  17.  
  18. int main()
  19. {
  20. struct perfiljugador *players;
  21. players = reservar(2);
  22. players[0].jugada = 10.5;
  23. players[0].puntos = 5;
  24. players[1].jugada = 5.1;
  25. players[1].puntos = 3;
  26. printf("\nJugadas>%f\n", players->jugada);
  27. printf("\nPuntos>%d\n", players->puntos);
  28. printf("\nJugadas>%f\n", players[1].jugada);
  29. printf("\nPuntos>%d\n", players[1].puntos);
  30. CalcularPuntos(players, 2, &players[1]);
  31. return 0;
  32. }
  33.  
  34. void CalcularPuntos(struct perfiljugador *players, int n, struct perfiljugador *banca){
  35.    do{
  36.        if(players[n].jugada > 7.5){
  37.            printf("El %dº jugador se paso y pierde 2p\n",n);
  38.            players[n].puntos -= 2;
  39.            printf("Puntuacion total: %d",players[n].puntos);
  40.        }else if(players[n].jugada > banca->jugada){
  41.            printf("El %dº jugador gana a la banca, gana 2p\n", n);
  42.            players[n].puntos += 2;
  43.            printf("Puntuacion total: %d", players[n].puntos);
  44.            }
  45.            else {
  46.                printf("La BANCA gana al %dº jugadorn\n",n);
  47.                banca->puntos += 2;
  48.            }
  49.        n--;
  50.    }while(n>0);
  51. }

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


Título: Re: Problema con struct dentro de libreria
Publicado por: dkmarley en 23 Julio 2010, 16:15 pm
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



Título: Re: Problema con struct dentro de libreria
Publicado por: cbug en 23 Julio 2010, 16:18 pm
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:

Código
  1. void CalcularPuntos(struct perfiljugador *players, int n, struct perfiljugador *banca){
  2.    do{
  3.        if(players[n].jugada > 7.5){
  4.            printf("El %dº jugador se paso y pierde 2p\n",n + 1);
  5.            players[n].puntos -= 2;
  6.            printf("Puntuacion total: %d",players[n].puntos);
  7.        }else if(players[n].jugada > banca->jugada){
  8.            printf("El %dº jugador gana a la banca, gana 2p\n", n + 1);
  9.            players[n].puntos += 2;
  10.            printf("Puntuacion total: %d", players[n].puntos);
  11.            }
  12.            else {
  13.                printf("La BANCA gana al %dº jugadorn\n",n);
  14.                banca->puntos += 2;
  15.            }
  16.        n--;
  17.    }while(n>=0); //Acuerdate que se apunta hasta el primer elemento que es 0
  18. }


Título: Re: Problema con struct dentro de libreria
Publicado por: dkmarley en 23 Julio 2010, 16:27 pm
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 ....


Título: Re: Problema con struct dentro de libreria
Publicado por: cbug en 23 Julio 2010, 16:31 pm
Código:
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:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. struct perfiljugador{
  5.    float jugada;
  6.    int puntos;
  7. };
  8.  
  9.  
  10. struct perfiljugador *reservar(int n){
  11.    struct perfiljugador *p;
  12.    p = (struct perfiljugador *) malloc(n*sizeof(p));
  13.    return p;
  14. }
  15.  
  16. void CalcularPuntos(struct perfiljugador *, int, struct perfiljugador *);
  17.  
  18. int main()
  19. {
  20. struct perfiljugador *players;
  21. players = reservar(2);
  22. players[0].jugada = 10.5;
  23. players[0].puntos = 5;
  24. players[1].jugada = 5.1;
  25. players[1].puntos = 3;
  26. CalcularPuntos(players, 1, &players[0]);
  27. return 0;
  28. }
  29.  
  30. void CalcularPuntos(struct perfiljugador *players, int n, struct perfiljugador *banca){
  31.    do{
  32.        if(players[n].jugada > 7.5){
  33.            printf("El %dº jugador se paso y pierde 2p\n",n + 1);
  34.            players[n].puntos -= 2;
  35.            printf("Puntuacion total: %d",players[n].puntos);
  36.        }else if(players[n].jugada > banca->jugada){
  37.            printf("El %dº jugador gana a la banca, gana 2p\n", n + 1);
  38.            players[n].puntos += 2;
  39.            printf("Puntuacion total: %d", players[n].puntos);
  40.            }
  41.            else {
  42.                printf("La BANCA gana al %dº jugadorn\n",n);
  43.                banca->puntos += 2;
  44.            }
  45.        n--;
  46.    }while(n>=0);
  47. }

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.


Título: Re: Problema con struct dentro de libreria
Publicado por: dkmarley en 23 Julio 2010, 16:37 pm
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


Título: Re: Problema con struct dentro de libreria
Publicado por: cbug en 23 Julio 2010, 16:42 pm
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).


Título: Re: Problema con struct dentro de libreria
Publicado por: dkmarley en 23 Julio 2010, 16:51 pm
jajaja si si tiene lista de errores.. xD si utilizo gcc dentro de netbeans, respecto a lo de [n] no tenia ni idea de que se pudiera hacer de esa forma xDD ya sabes los maestros y su tecnica divina de ai no lo saca ni dios .. xDD

gracias por todo, ahora toca terminar la practica!! xDD