Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    87

    [C] passaggio puntatore a nodo

    Ciao a tutti e buon anno! avrei una domanda veloce, qual'è il modo migliore per passare un puntatore a nodo quando vogliamo manipolare una lista tramite qualche funzione? io sinceramente vado quasi a caso.

    Pensavo, visto che già il puntatore a nodo è già di suo un indirizzo tanto vale invocare la funzione in questo modo :

    punt2=funzione(punt); (punt è il puntatore a nodo se non si fosse capito)

    lo chiedo perchè qualche volta ho visto cose tipo:

    punt=funzione(&punt);

    però non ne capisco il funzionamento,cioè,stando all'ultima invocazione che vi ho scritto, dovrebbe mandare un puntatore al puntatore originale e quindi dovrei mettere asterischi ovunque e EEEE!! sto iperventilando.......

    In sostanza..... è accettabile fare come faccio io? cioè punt2=funzione(punt);?


    prototipo funzione: NODO *funzione(NODO *punt); (caso mio)

    prototipo funzione: NODO *funzione(NODO **punt);
    (l'altro....di conseguenza qualunque operazione che chiami in causa il puntatore necessiterebbe dell'asterisco...)


    Grazie mille, scusate se non si capisce o è scritto male :| ho bisogno di essere rassicurato quindi se potete rispondere......entro la fine dell'anno magari!!! ahahahhahaha

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Passando (NODO *) se vuoi aggiungere un elemento in testa devi perforza ritornare (NODO *) e assegnarlo nel main.
    Passare (NODO **) ti permette di modificare la testa senza dover necessariamente ritornare (NODO *).

    Se dovessi sviluppare un qualcosa che agisca in tutta sicurezza io farei così:
    codice:
    #include <stdbool.h>
    
    typedef struct {...} NODO;
    typedef NODO *LISTA;
    
    bool funzione(LISTA *l, ...) {
      ...
      NODO *testa = *l;
      ...
      return fail?false:true;
    }
    Almeno concettualmente.
    Ciò anche perché le allocazioni di memoria non sono sempre possibili e, in caso di fallimento, bisogna lasciare il programma in uno stato consistente per lasciare decidere cosa fare al main e permettere il rilascio della memoria allocata.

    Questo è quello che farei io ed è solo un'opinione.
    Avere come valore di ritorno (NODE *) ti da il vantaggio di poter passare direttamente il valore ritornato a qualche altra funzione, ma questa occasione (in C) avviene raramente e in più non può essere in alcun modo sicura perchè, anche volessimo passare come parametro una &flag, poi non avremmo modo di controllarla.
    Ultima modifica di Scara95; 31-12-2013 a 21:31
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Un'ottima alternativa che viene spesso usata per ogni sorta di lista è usare una struttura di supporto che aiuti a gestire la lista stessa.
    codice:
    typedef struct {....} NODO;
    
    typedef struct
    {
        NODO* root;
        NODO* current;
        ...altri parametri.
    }TREE;
    
    
    int tree_add ( TREE* t , ... )
    {
         ...
         if ( t->root == NULL )
         {
              t->root = newnodo;
              return 1;
         }
         ...
    }
    BUON ANNO

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    87
    Grazie mille ad entrambi! Io di solito creo mille puntatori ausiliari per evitare di perdermi qualche pezzo strada facendo :| sinceramente mi fa paura mandare direttamente così l'indirizzo della testa :| Grazie ancora ciao!

  5. #5
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Quote Originariamente inviata da Satiro88 Visualizza il messaggio
    sinceramente mi fa paura mandare direttamente così l'indirizzo della testa :|
    Perché dovrebbe farti paura passare l'indirizzo della testa?! La funzione la scrivi tu ed è una semplificazione per chi la utilizza!

    Prego comunque
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  6. #6
    Grazie mille ad entrambi! Io di solito creo mille puntatori ausiliari per evitare di perdermi qualche pezzo strada facendo :| sinceramente mi fa paura mandare direttamente così l'indirizzo della testa :| Grazie ancora ciao!
    Prova a pensare agli oggetti sotto il c.
    L'idea mi è venuta quando il k&r parlava di oggetti mentre spiegava le strutture.OVVIO! un oggetto può essere una struttura.
    Quindi se io ho un oggetto TREE il primo parametro per ogni funzione (proprio come fa il c++) sarà l'oggetto TREE in cui io lavorerò.
    Nel c la strutturazione è molto importante se no finisci nel perderti in qualche ***************

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.