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

    [C] Passi per creare una lista: ho un dubbio

    Ciao a tutti,

    avrei bisogno di un grosso aiuto riguardante i vari passi che permettono di costruire una lista.
    Ho già scritto diversi programmi con l'uso di liste ma diciamo che non mi sono mai fermato a pensare bene al codice, lo davo per scontato e questo è un errore.

    Diciamo che ci sono alcuni passaggi che mi sono poco chiari e che spero possiate chiarirmeli.

    Dopo aver creato una struttura
    codice:
    struct list {
     int dim;
     struct list *next;
    };
    per mia comodità rinomino la struttura appena creata in "lista"
    codice:
    typedef struct list *lista;
    ma con questa operazione dico che il tipo lista è un puntatore a se stesso, e francamente non riesco a capire perchè.
    Come primo elemento di una lista non basterebbe scrivere solo
    codice:
    typedef struct list lista l1;
    La seconda cosa che non riesco a capire (la più importante) riguarda il processo che mi consente di creare un nuovo elemento della lista.
    Mettiamo il caso che io lavori all'interno della funzione creaLista e che mi debba creare un certo numero di elementi (passato come parametro).
    codice:
    lista creaLista(int a) {
     //vario codice...
    
     lista l = (lista) malloc (typedef(lista)); // <-- questa è la riga incriminata
     lista l->next = ...;  
     return ...;
    }
    io dico questo:
    -dichiaro l che è un puntatore a lista.
    -tramite la funzione malloc occupo un certo numero di byte e faccio tornare l'indirizzo del primo byte dello spazio occupato che poi assegnerò a l.

    ed adesso?
    per quanto ne so io adesso l punta ad una certa locazione, ma come faccio a sapere con certezza che lo spazio riservato da malloc contiene effettivamente una variabile intera ed una puntatore??


    Scusate la domanda forse troppo banale, ma non voglio correre il rischio di avere dei dubbi sui puntatori visto che saranno argomento di tutti i giorni.
    Devo essere più preparato possibile.

    Grazie

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

    Re: [C] Passi per creare una lista: ho un dubbio

    Originariamente inviato da Downloader

    per mia comodità rinomino la struttura appena creata in "lista"
    Non stai "rinominando" nulla ...

    Stai dichiarando un "nuovo tipo di dato", chiamato lista.

    Questo nuovo tipo di dato e' un puntatore ad una struttura list.

    ma con questa operazione dico che il tipo lista è un puntatore a se stesso, e francamente non riesco a capire perchè.
    Un puntatore a se' stesso? No. Un puntatore alla struttura list.

    list e' la struttura e lista il puntatore a tale struttura.

    Un metodo piu' chiaro per dichiarare il tutto sarebbe

    codice:
    typedef struct list
    {
       int dim;
       struct list *next;
    } *plist;
    Chiamando il nuovo tipo plist ti ricordi che e' un puntatore alla struttura lista.

    codice:
    typedef struct list lista l1;
    Questa scrittura non ha senso ...

    Se vuoi allocare staticamente un elemento della lista, scrivi

    struct list l1;

    ma ricorda che una struttura puo' non avere alcun elemento e quindi e' piu' giusto allocarli tutti dinamicamente. Se una lista non ha alcun elemento (come all'inizio del programma), esistera' *soltanto* il puntatore al suo primo elemento e questo puntatore (non esistendo il primo elemento) sara' NULL. Quindi scriverai

    struct list *mialista=NULL;

    ed avendo dichiarato il nuovo tipo di dato, scriverai

    plist mialista=NULL;

    lista l = (lista) malloc (typedef(lista)); // <-- questa è la riga incriminata
    Quella riga e' sbagliata ... dovrebbe essere

    lista l = (lista) malloc (sizeof(struct list));

    io dico questo:
    -dichiaro l che è un puntatore a lista.
    -tramite la funzione malloc occupo un certo numero di byte e faccio tornare l'indirizzo del primo byte dello spazio occupato che poi assegnerò a l.

    ed adesso?
    per quanto ne so io adesso l punta ad una certa locazione, ma come faccio a sapere con certezza che lo spazio riservato da malloc contiene effettivamente una variabile intera ed una puntatore??
    Ne sei certo, come ti ho detto, se indichi che il numero di byte da allocare e'

    sizeof(struct list)
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    726
    Si si scusa, volevo mettere sizeof e mi sono sbagliato con typedef (l'ora era tarda e la mente non più lucidissima).

    Comunque sia:
    io dico questo:
    -dichiaro l che è un puntatore a lista.
    -tramite la funzione malloc occupo un certo numero di byte e faccio tornare l'indirizzo del primo byte dello spazio occupato che poi assegnerò a l.

    ed adesso?
    per quanto ne so io adesso l punta ad una certa locazione, ma come faccio a sapere con certezza che lo spazio riservato da malloc contiene effettivamente una variabile intera ed una puntatore??
    Io questa parte ancora non riesco a immaginarmela.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da Downloader
    Si si scusa, volevo mettere sizeof e mi sono sbagliato con typedef (l'ora era tarda e la mente non più lucidissima).
    Ok

    Comunque sia:

    Io questa parte ancora non riesco a immaginarmela.
    Non c'e' da nulla immaginare ... tu dici "quanti bytes" devono essere allocati in memoria fornendo alla malloc la grandezza in bytes della struttura e la malloc alloca la memoria restituendo un puntatore. Cosa c'e' da immaginare?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    726
    Originariamente inviato da oregon
    Non c'e' da nulla immaginare ... tu dici "quanti bytes" devono essere allocati in memoria fornendo alla malloc la grandezza in bytes della struttura e la malloc alloca la memoria restituendo un puntatore. Cosa c'e' da immaginare?
    Non lo so, c'è qualcosa che mi sfugge.
    Fino a quando dici che con la malloc alloco n bytes quanti ne servono per la struttura e che questa funzione mi restituisce un puntatore sono d'accordo.
    Quello che non riesco a capire è questo:
    qual'è lo stato della memoria appena riservato lo spazio e restituito un puntatore?
    Come faccio a sapere con certezza che nello spazio allocato ci sono le variabili dim e *next?

    Un'altra cosa che non capisco:
    ho questo codice:
    codice:
    struct lst {
     int d;
     struct lst *next;
    };
    
    typedef struct lst *plista;
    
    int main()
    {
     plista l=0; //<-- ??
     l->next = NULL; //<-- ??
     l->d = 10; // <-- ??
     
     return 0;
    }
    Perchè il codice nel main non mi da errori?
    Non esistono strutture al momento.

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da Downloader
    Quello che non riesco a capire è questo:
    qual'è lo stato della memoria appena riservato lo spazio e restituito un puntatore?
    Il suo contenuto e' casuale. Devi inizializzarlo ... non mi sembra un problema.

    Come faccio a sapere con certezza che nello spazio allocato ci sono le variabili dim e *next?
    Questa domanda non ha senso. E' importante che lo spazio allocato sia della dimensione corretta per ospitare i dati della struttura. La divisione della struttura la conosce il compilatore ...

    Un'altra cosa che non capisco:
    ...
    Perchè il codice nel main non mi da errori?
    Non esistono strutture al momento.
    Il compilatore non lo sa quando lo compila. Avrai un errore a runtime perche' la scrittura in memoria tramite il puntatore sara' tentata solamente all'atto dell'esecuzione.

    Ma questo vale in generale per i puntatori, non sono per quelli che puntano a strutture.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    726
    Originariamente inviato da oregon
    Questa domanda non ha senso. E' importante che lo spazio allocato sia della dimensione corretta per ospitare i dati della struttura. La divisione della struttura la conosce il compilatore ...
    Questa domanda non ha senso per te.
    Però per uno a cui viene detto: "una lista si fa cosi cosi e cosi" mi pare logico che si ponga anche domande di questo tipo.

    Comunque grazie per l'aiuto che mi hai dato!

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da Downloader
    Questa domanda non ha senso per te.
    Però per uno a cui viene detto: "una lista si fa cosi cosi e cosi" mi pare logico che si ponga anche domande di questo tipo.
    Intendo che non ha senso in generale, perche' le variabili non "esistono" all'interno di uno spazio ...

    Comunque grazie per l'aiuto che mi hai dato!
    Di nulla.
    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
    Intendo che non ha senso in generale, perche' le variabili non "esistono" all'interno di uno spazio
    Si si lo so.
    L'ho messa in quei termini per cercare di rendere di più facile comprensione il mio dubbio.

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Beh ... ok, anche se io non ho ancora capito il significato preciso di questo tuo dubbio ... comunque, buon lavoro ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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.