Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 24
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    726

    [C] Passaggio dei parametri per riferimento

    Il C lavora solo e soltanto con i passaggi dei valori da una funzione ad un'altra tramite valore.
    Ciò nonstante esiste qualche trucchetto che mi consente di fare in modo che un valore che passo come parametro ad una funzione venga poi effettivamente modificato anche all'interno dell'ambiente (ovvero della funzione) chiamante.

    Se opero con tipi di dati predefiniti non c'è problema, ma se ad esempio dovessi lavorare con puntatori a liste??

    Ad esempio:

    dichiaro una struttura del tipo
    codice:
    struct lista {
     int d;
     struct lista *next;
    };
    e tramite la funzione creaLista popolo la lista e restituisco un puntatore
    codice:
    struct lista *creaLista(int val) 
    {
     if (val < 1)
      return NULL;
     else {
      struct lista *l = (struct lista *) malloc(sizeof(struct lista));
      l->d = val--;
      l->next = creaLista(val);
      return l;
     }
       
    }
    adesso voglio crearmi una funzione che chiamerò cambiaElemento la quale prenderà come input un intero che rappresenta il numero di spostamenti che voglio effettuare e il puntatore alla lista.
    La funzione avrà ritorno void, ma io dovrò modificare l'indirizzo a cui punta il puntatore alla lista (che chiamo l e che è dichiarato nel main) in modo tale che la nuova testa della lista non sarà più il primo effettivo elemento della lista, ma sarà determinata dal numero di spostamenti che dovrò fare (indicati da val) a partire dal primo elemento della lista.

    esempio:
    se da 1->3->5->4->3->NULL
    dico che val = 2 allora il primo elemento della lista diventerà 5 e la lista sarà cosi:
    5->4->3->NULL


    codice:
    void cambiaElemento(int, struct lista *);
    Tutto ciò per non usare i return e per imparare come si fa un passaggio di parametri per riferimento.

    Ma come faccio??
    Mi date una mano?

    Grazie

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462

    Re: [C] Passaggio dei parametri per riferimento

    Originariamente inviato da Downloader
    Il C lavora solo e soltanto con i passaggi dei valori da una funzione ad un'altra tramite valore.
    Chi te lo ha detto?

    Ciò nonstante esiste qualche trucchetto che mi consente di fare in modo che un valore che passo come parametro ad una funzione venga poi effettivamente modificato anche all'interno dell'ambiente (ovvero della funzione) chiamante.
    Trucchetto? Lo fai NORMALMENTE con i puntatori ...

    Non capisco queste premesse ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    726
    Mah, io ho sempre saputo cosi a dire il vero.

    Comunque sia, potresti darmi una mano??

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Stai parlando di C ... quindi vuoi passare i dati con un puntatore?

    Se vuoi passare un intero per puntatore scrivi

    void funzione(int *a)

    e nella funzione puoi modificare il valore della variabile che hai passato per puntatore ...

    O volevi sapere altro?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    726
    Volevo sapere questo:

    Se si lavora con un intero non ho problemi a fare un puntatore, ma se dovessi lavorare con una struttura (come nell'esempio di sopra come posso fare??).

    Ad esempio:
    riferiamoci al codice che ho precedentemente scritto e assumiamo che dal main io mi sia dichiarato una variabile puntatore ad una struttura chiamato struct lista *l.
    Tramite una funzione ricorsiva popolo la lista e adesso voglio fare un passaggio di parametri per riferimento ad una una certa funzione F(x) (tipo di ritorno void).

    Ma come faccio??
    se ad esempio nel main lancio la funzione in questo modo:
    F(&l) passo effettivamente l'indirizzo di memoria del puntatore alla testa della lista l, ma ricevo un warning.

    nella funzione che voglio lanciare cosa devo specificare come tipo del parametro?
    sempre struct lista *??
    Ovvero ad esempio come prototipo dovrei scrivere
    codice:
    void F (struct lista *);
    ??

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Se nel main scrivi

    codice:
    int main(void)
    {
      struct lista *l;
    
      ...
    }
    e la tua funzione e'

    void F (struct lista *);

    allora devi passare semplicemente

    F(l);

    perche' l e' gia' un puntatore alla struttura ...

    Se scrivi

    F(&l);

    passi un puntatore ad un puntatore alla struttura e ottieni giustamente il warning ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    726
    Quindi mi stai dicendo che se faccio cosi:

    codice:
    int main()
    {
     int n = 10;M
     struct lista *l = creaLista(n);
     F(l,2);
    }
    e nella funzione scrivo:
    codice:
    void F (struct lista *l, int n)
    {
      while (n-- > 0)
       l = l->next;
    }
    eseguo il passaggio del parametro "l" per riferimento??

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Un attimo ... rischiamo di fare confusione ...

    Essendo il dato "un puntatore" cosi' lo passi sempre per valore ... se lo vuoi passare per riferimento, allora devi usare l'operatore &

    Ma tu volevi sapere come poterti spostare all'interno della lista una volta passato il puntatore alla funzione ... e quindi basta il valore del puntatore e il codice che hai scritto va bene (a patto che fai anche i controlli di validita' del valore del puntatore ...)
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    726
    Originariamente inviato da oregon
    Un attimo ... rischiamo di fare confusione ...

    Essendo il dato "un puntatore" cosi' lo passi sempre per valore ... se lo vuoi passare per riferimento, allora devi usare l'operatore &

    Ma tu volevi sapere come poterti spostare all'interno della lista una volta passato il puntatore alla funzione ... e quindi basta il valore del puntatore e il codice che hai scritto va bene (a patto che fai anche i controlli di validita' del valore del puntatore ...)
    No no, io volevo sapere come fare il passaggio per riferimento, usando quindi l'operatore &.
    E' per questo che qualche post fa avevo scritto la seguente chiamata a funzione:
    codice:
    F(&l);

  10. #10
    Potresti creare un puntatore al puntatore della testa della lista, e lavorare su quello.
    Però sono seminuovo di programmazione, quindi...
    Se state chiamando per i piedini mancanti,lasciate il vostro indirizzo,e i piedi di ricambio vi saranno consegnati da mio nipote Jody. E ora, io devo ritornare nel dolce abbraccio della cripta... Ma tornerò!!!

    The Simpson ; AABF08 (Domenica orrenda domenica)

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 © 2024 vBulletin Solutions, Inc. All rights reserved.