Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    44

    [C] puntatori doppi e strutture

    ciao a tutti
    ho una situazione di questo tipo:

    devo scrivere una funzione che inserisca una struttura in coda ad una coda di strutture.

    la signatura e la seguente
    void insertBackThreadQ(tcb_t **tp , tcb_t *t_ptr) dove tcb_t è una struttura.

    tp (tail pointer) punta al puntatore all' ultimo elemento della coda e t_ptr punta all' elemento da aggiungere in coda.

    la struttura tcb_t ha 2 puntatori
    tcb_t *succ
    tcb_t *prec
    per concatenare le celle

    ho pensato di scrivere la funzione in questo modo

    if(**pt==NULL) //se la coda è vuota
    *pt=t_ptr; /* il puntatore puntato da pt punta (cioè quello che punta al fondo) all' elemento appena aggiunto */

    else{
    //la coda non è vuota
    // devo sistemare succ e prec dell' elemento appena aggiunto
    // la coda è circolare
    t_ptr->succ=*tp->next; // next dell' ultimo aggiunto è uguale a next dell' vecchio fondo cioè il primo essendo circolare

    t_ptr->prec=*tp // il precedente è il vecchio fondo

    *tp->next->prec=t_ptr; // sistemo il prec del primo mettendogli quello apena aggiunto
    *tp->succ=t_ptr;
    }

    questa funzione viene testata cosi:


    tcb_t *qa, *q;


    q=indirizzo di una struttura
    qa=makeEmptyThreadQ() che mette null in qa

    insertBackThreadQ( &qa , q)

    la prima volta visto che qa è null, qa dovrebbe puntare a t_ptr
    quando poi viene rilanciata dovrebbe eseguire l' else e concatenare il nuovo elemento,
    ma quando compilo mi da errori tipo: assegnamento errato o che l' espressione da assegnare non è una struttura.

    mi spiegate dove sbaglio?

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    In quale riga hai l'errore?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it L'avatar di KrOW
    Registrato dal
    Feb 2009
    Messaggi
    281
    Ciao .... Prima di tutto quando posti del codice, inseriscilo nel tag code altrimenti qui non capiamo niente.
    Detto questo potresti dirmi cos' è pt ??? E' un puntatore di puntatori a tcb_t ???

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    44
    ho scritto un sorgente che simula la situazione

    #include <stdio.h>
    #include <malloc.h>

    typedef struct prova{
    int i;
    struct prova *succ;
    struct prova *prec;

    } prova;


    prova *qa, *q;

    void inserisci(prova **tp, prova *t_tpr);


    int main(){

    qa=NULL;
    q=(prova *)malloc(sizeof(prova));

    inserisci(&qa, q);

    inserisci(&qa, q);

    return(0);
    }

    void inserisci(prova **tp, prova *t_tpr){
    if(**tp==NULL) //se la coda è vuota
    *tp=t_tpr; /* il puntatore puntato da pt punta (cioè quello che punta al fondo) all' elemento appena aggiunto */

    else{
    //la coda non è vuota
    // devo sistemare succ e prec dell' elemento appena aggiunto
    // la coda è circolare
    t_tpr->succ=*tp->succ; // next dell' ultimo aggiunto è uguale a next dell' vecchio fondo cioè il primo essendo circolare

    t_tpr->prec=*tp // il precedente è il vecchio fondo

    *tp->succ->prec=t_tpr; // sistemo il prec del primo mettendogli quello apena aggiunto
    *tp->succ=t_tpr;
    }
    }


    dalla compilazione risulta

    prova.c: In function ‘inserisci’:
    prova.c:28: error: invalid operands to binary == (have ‘prova’ and ‘void *’)
    prova.c:35: error: request for member ‘succ’ in something not a structure or union
    prova.c:39: error: request for member ‘succ’ in something not a structure or union
    prova.c:40: error: request for member ‘succ’ in something not a structure or union


    che sono


    //righa 28 if(**tp==NULL) //se la coda è vuota
    *tp=t_tpr; /* il puntatore puntato da pt punta (cioè quello che punta al fondo) all' elemento appena aggiunto */

    else{
    //la coda non è vuota
    // devo sistemare succ e prec dell' elemento appena aggiunto
    // la coda è circolare
    t_tpr->succ=*tp->succ; // next dell' ultimo aggiunto è uguale a next dell' vecchio fondo cioè il primo essendo circolare

    t_tpr->prec=*tp // il precedente è il vecchio fondo

    *tp->succ->prec=t_tpr; // sistemo il prec del primo mettendogli quello apena aggiunto
    *tp->succ=t_tpr;
    }

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    44
    Originariamente inviato da KrOW
    Ciao .... Prima di tutto quando posti del codice, inseriscilo nel tag code altrimenti qui non capiamo niente.
    Detto questo potresti dirmi cos' è pt ??? E' un puntatore di puntatori a tcb_t ???
    qa è il puntatore al fondo della coda (quindi o null se la coda è vuota o un tcb_t) e pt punta a qa

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Deve essere

    if(*tp==NULL)

    e

    (*tp)->succ
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    44
    funziona!! grazie mille.

    Quindi alla fine servono le parentesi per disambiguare la valutazione dell' puntatore.
    Ma era necessario utilizare un doppio puntatore o era solo una finezza?

  8. #8
    Utente di HTML.it L'avatar di KrOW
    Registrato dal
    Feb 2009
    Messaggi
    281
    Secondo me era inutile utilizzare un puntatore di puntatori bastava anche un semplice puntatore
    (visto anche che alla fine ti ha confuso un pò)

  9. #9
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    44
    Originariamente inviato da KrOW
    Secondo me era inutile utilizzare un puntatore di puntatori bastava anche un semplice puntatore
    (visto anche che alla fine ti ha confuso un pò)
    il motivo secondo me è spiegato in questa nota


    void insertBackThreadQ(tcb_t **tp, tcb_t *t_ptr);

    Insert the ThreadBLK pointed to by t_ptr at the back of the thread queue whose tail-pointer is
    pointed to by tp; note the double indirection through tp to allow for the possible updating of the
    tail pointer as well

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.