Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1

    [C] Dichiarare una struct di dimensioni variabili

    Ho un problema con le definizioni delle struct.....
    Questa è la struttura di cui dispongo:

    codice:
    /* Definisce il tipo stringa */
    typedef char stringa[20];
    
    struct esempio {
    
             int ID;                         /* id dell'esempio */
             stringa arrayDiNomi[x];        /* vettore di x nomi */
    
        };
    Devo fare in modo che "arrayDiNomi" della struttura "esempio" abbia una dimensione "x" parametrica (nel mio caso deve essere data da tastiera....)

    Non ho idea di come si possa fare.....o meglio SE si possa fare!!!
    In entrambi i casi chiedo un suggerimento...o un un altro modo per fare questa cosa!!!

  2. #2
    Scendo più nel dettaglio di quello che è il mio problema:

    Devo lavorare su un file ad accesso casuale che ho costruito per contenere oggetti "esempio".
    Il problema è che non so a priori la dimensione del campo x, ovvero non conosco di preciso quante stringhe contenga il campo "arrayDiNomi" degli elementi "esempio" del file (NB: in uno stesso file, gli elementi hanno tutti la medesima x; file differenti possono però avere x diverse .

    Dovendo lavorare sul numero di stringhe, ho dichiarato nel mio programmino una struttura esempio corrispondente a quella del file (come quella scritta sopra), dove salvare le stringhe che leggo. Ma come faccio a dichiarare la x della dimensione giusta? E' possibile farlo dinamicamente? (magari usando malloc...)

  3. #3
    Ecco quello che ho fatto io:

    Definisco io il tipo "esempio" appena prima del main, dandogli il valore di "x" poichè lo conosco a priori
    codice:
    struct esempio {
             int ID;                         
             stringa arrayDiNomi[4];        
        };
    E poi dal main carico l'esempio del file in un esempio vuoto creato da me...
    codice:
    int main() {
        
        FILE *fPtr;
        
        /* crea l'esempio "e" con informazioni di default */
        struct esempio e = {0, {0} };
        
        /* fopen apre il file; se non ci riesce, provoca l'uscita dal programma */
        if((fPtr = fopen("file.dat", "rb")) == NULL) {
                  printf("Il file non puo essere aperto. \n");
        }
        else {
             fread( &e, sizeof(struct esempio), 1, fPtr );
    
         ..........
    Io vorrei rendere parametrico il valore di x, leggendolo dal file! A leggerlo non è un problema, il problema è come riuscire a dichiarare l'esempio di default, poichè lo devo necessariamente dichiarare prima di leggere dal file!!!

    Se questa strada che ho intrapreso non porta da nessuna parte, qualcuno saprebbe indicarmi un metodo alternativo?

    Grazie in anticipo

  4. #4
    Potresti usare dei puntatori e allocare la memoria di volta in volta.

  5. #5
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    codice:
    struct esempio {
             int ID;                         
             stringa arrayDiNomi[4];        
        };
    Lettura e scrittura tramite struct è possibile a condizione di mantenere i campi fissi, altrimenti anche il sistema di scrittura e/o lettura dev'essere dinamico.

    Rendere dinamico arrayDiNomi significa solo cercare rogne. Dovresti trasformarlo in un puntatore e allocarlo con la malloc, però quando leggerai con la fread, il puntatore sarà sovrascritto e perderai la memoria puntata; nel puntatore ci sarà spazzatura (non quello che intendi leggere) e sicuramente prima o poi avrai un crash.
    Se le stringhe che vuoi leggere sono precedute da un intero, potresti leggere prima l'intero ed effettuare una successiva fscanf con un buffer adeguatamente dimensionato.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  6. #6
    Anche se si usa un doppio puntatore?...non credo possa dare problemi...
    Se ogni volta gli viene allocato al nostro puntatore la memoria giusta per contente la stringa memoria finchè non si fa una free() non si dovrebbe perdere...quindi non si sporca...

  7. #7
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    La fread legge il numero di byte che gli si passa come parametro. Se si passa sizeof(struct esempio) leggerà comunque 8 byte (4 dell'int + 4 del puntatore) e li andrà a mettere nella variabile passata come parametro tramite un'operazione di copia bruta.
    Ovviamente la fread non può sapere se la struttura contiene puntatori o no, quindi sovrascrive anche l'eventuale puntatore contenuto, che non punterà più alla memoria "mallocata" ma a qualcos'altro.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  8. #8
    Ma bisogna usare per forza fread?

    Si usano puntatori e si crea una funzione apposita che gestisce i dati del file, magari utilizzando fgets, in cui viene opportunamente riempita la struttura.

  9. #9
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Ovvio che no. Però occorre anche dire il perché, usare una fread su una struttura contenente un puntatore crea solo guai.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  10. #10
    Si è vero quello che dice shodan...non avevo letto bene il problema...è lo stesso problema che avevo avuto io con le fifo, in quanto bisogna sapere in anticipo la grandezza che si sta ricevendo...cosa che non è possibile sapere in anticipo...a meno che non si facciano sue read, la prima per sapere quanto sarà grande l' input, e la seconda per leggere la struct

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.