Problema con accceso a estructuras.

Iniciado por chemaspain, 6 Mayo 2011, 15:07 PM

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

chemaspain

Hola a todos.

Estoy muy agobiado con una practica de programacion que debo entregar pronto y no se como resolver un problema leve que me ha surgido que me tiene muy atrancado, a ver si me podeis echar un cable y ayudarme. Esta es la funcion y la definicion de la estructura:



typedef struct tSupplier{
int idSupplier;
    tString name;
    tString addr;
    int phone[MAX_PHONE];
    struct tFurniture *firstFur,*currFur;                               
    float profitMargin;
} tSupplier;

typedef struct {
int idFurniture;
int idSup;
tString nameFur;
float sizes[MAX_SIZES];
tString typeFur;
tColor color;
float costPrice;
float retailPrice;
int deliveryTime;
struct tFurniture *prevFur, *nextFur;                               
struct tFurniture *prevFurType, *nextFurType;
} tFurniture;

........

void fur_get_name (tFurniture f, tString n)
{
     strcpy (n,f.nameFur);       
}

.......

void sup_set_profitMargin (tSupplier *s, float r)
{
     tString name;
     float price;
     
     s->profitMargin = r;
   
     s->currFur=s->firstFur;
     if (s->currFur!=NULL)
        {
             sup_get_name(*s,name);
             printf("-----------------------------------------------------------------");
             printf("Supplier: %s \n",name);
             
             if (s->idSupplier == s->currFur->idSup) /* Aqui me da el primer error de dereferencing  */
                       s->currFur->retailPrice = s->profitMargin * s->currFur->costPrice;
             while (s->currFur!=NULL)
                   {
                        fur_get_name(s->currFur,name); /* Aqui me da el error de incompatible tipo de argumento en parametro 1*/
                        printf("Furniture: %s \t",name);
                       
                        price=fur_get_retailPrice(s->currFur);
                        printf("Old retail price: %d \t", price);
                       
                        s->currFur->retailPrice = s->profitMargin * s->currFur->costPrice;
                       
                       
                        price=fur_get_retailPrice(s->currFur);
                        printf("New retail price: %d \n", price);
                       
                        s->currFur=s.currFur->nextFur;
                   }
             printf("-----------------------------------------------------------------");
        }
}


El caso es que me da el derreferencing ese tipico de las estructuras mal leidas pero es que he probado de todo y no se como solucinarlo. Si alguien me guiara en como acceder a la estructura, en las líneas marcadas con los comentarios, solo hay dos, le estaría enormemente agradecido. El resto ya las resolvería yo, por que son iguales.

Gracias.

Saludos.
Chema.

Akai

typedef struct{}tFurniture

struct qué?

esa struct necesitará un nombre, no?

chemaspain

Si, perdon, se me olvido colocar el  nombre de la estructura, y parece que al hacerlo ya no me da el fallo de dereferencing, a veces es una tonteria pero cuando te ciegas, es que no hay manera de resolverlo.

Sigo sufriendo el otro fallo de incompatible tipo de argumento, que me sigue dando en la linea que marque con el comentario correspondiente...Alguna sugerencia??????

Gracias por la ayuda Akai.

Saludos.
Chema.

Acermax

Esa función, en el primer parámetro está esperando un dato de tipo tFurniture, y tu le estás pasando un puntero.

chemaspain

Ya sabia eso acemax, de todas formas gracias por tu aportacion, el caso es como transformo ese parametro en un tFurniture en vez de un puntero, que es lo que ahora mismo tengo, ya que el encabezado de la funcion no lo puedo modificar, y estoy un pelin verde en el tema de pasos por valor o por referencia.

Entiendo cuando debo pasarlos por valor o por referencia pero en C se me resiste como indicarselo para que lo compile correctamente y no de errores. Entonces siempre voy tanteando si le pongo el asterisco, el punto o el ->.

Alguna ayudita con el dichoso puntero?????

Gracias.

Saludos.
Chema.

Akai

chemaspain, no te lo tomes a mal, por muy brusco que pueda somar, es un consejo: necesitas revisarte la teoria básica sobre el tema porque es precisamente eso lo que te está fallando. De todas formas te hago un resumen rápido.

& (ampersand)--> obtiene la dirección de memoria de una variable.

* (asterisco)--> obtiene lo apuntado por una variable.

. (punto) accede al campo de una estructura.

-> (flecha) --> accede al campo de una estructura apuntada por la variable. Es un atajo de *(puntero).campo

Por otro lado, tu problema es, que :

void fur_get_name (tFurniture f, tString n)

espera un tFurniture, no un *tFurniture como tu le pasas aquí:
fur_get_name(s->currFur,name)
s->CurrFur es un *tFurniture que tu mismo te has definido en tu declaración de la estructura tSupplier.

chemaspain

Hola  Akai.

Gracias por tus consejos y ayudas.

Al final lo resolvi, creandome un tFurniture auxiliar y asignandole el valor del tFurniture original que deseaba enviar a la funcion y no me dejaba, asi se lo pase correctamente. Quedo así la cosa:

void sup_set_profitMargin (tSupplier *s, float r)
{
     tString name;
     float price;
     tFurniture *pf,f;
     
     s->profitMargin = r;
 
     sup_firstFur (s, pf);
     
     if (pf!=NULL)
        {
             sup_get_name(*s,name);
             printf("-----------------------------------------------------------------");
             printf("Supplier: %s \n",name);
             
             if (s->idSupplier == s->currFur->idSup)
                       s->currFur->retailPrice = s->profitMargin * s->currFur->costPrice;
             while (s->currFur!=NULL)
                   {
                        f=*s->currFur;     
                        fur_get_name(f,name);
                        printf("Furniture: %s \t",name);
                       
                        price=fur_get_retailPrice(f);
                        printf("Old retail price: %d \t", price);
                       
                        s->currFur->retailPrice = s->profitMargin * s->currFur->costPrice;
                       
                        f=*s->currFur;
                        price=fur_get_retailPrice(f);
                        printf("New retail price: %d \n", price);
                       
                        sup_next_Fur (s,pf);
                   }
             printf("-----------------------------------------------------------------");
        }
}


Gracias a todos los que han respondido o me han intentado ayudar, al final salio bien la cosa.

Muchas gracias.

Saludos.
Chema.