Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    160

    [C] Problema su un progetto C

    Ciao a tutti!

    Spero possiate essermi d'aiuto. Sto facendo un progetto dove devo costruire un database. Praticamente ho una funzione chiamata CreateDatabaseFile() che deve creare un file di database. Questo file va aperto in modalità binaria e fin qui nessun problema. Il problema sta nella scrittura dell'header che è una struttura definita così:

    codice:
    	
    typedef struct {
    	
    	FILE	*fp;		//!< File pointer del database aperto
    	char	Name[DBF_NAME_LENGTH+1];	//!< Nome del database escluso estensione
    	int		NumFields;	//!< Numero dei campi del database
    	long	NumRecs;	//!< Numero totale di records nel database
    	int		HeaderLen;	//!< Lunghezza dell'Header
    	int		RecordLen;	//!< Lunghezza di un record del database
    	long	CurrentRec;	//!< Numero del record corrente 
    	time_t	LastUpdate;	//!< Data e ora ultimo aggiornamento (Julian date)
    	
    } DBF_INFO_t;
    Secondo le specifiche e' consigliaro creare un buffer dove serializzare tutti i campi necessari per poi scrivere tutto il buffer su file. Ecco questo punto mi riesce difficile, perché un buffer dovrebbe essere rappresentato da un array, ma l'array come fa a memorizzare tutti questi tipi di dato diversi?

    Grazie.

  2. #2
    Utente di HTML.it L'avatar di ibykos
    Registrato dal
    Feb 2005
    Messaggi
    201
    Potresti usare la fwrite:

    dichiarata una variabile di tipo struct DB_INFO_t

    codice:
    struct DB_INFO_t database;
    è possibile scrivere tutta la struttura nel file in un colpo solo in questo modo:

    codice:
    fwrite(file,&database,sizeof(struct DB_INFO_t));

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    160
    Grazie infatti mi hanno detto di usare la fwrite. Però ora sorge un altro problema e cioè che prima di scrivere i dati nel file devo convertire i byte di ogni campo di quella struttura in Network Byte Order (cioè diciamo in Big Endian) attraverso due funzioni già definite (basta solo chiamarle). Se io uso la fwrite per scrivere tutto d'un colpo la struttura nel file, come faccio a convertire i byte dei campi in Network Byte Order?

    Grazie

  4. #4
    Utente di HTML.it L'avatar di ibykos
    Registrato dal
    Feb 2005
    Messaggi
    201
    Non basta che converti i dati prima di scrivere su file?

    esempio:

    codice:
    lunghezza = (uint_16) htonl(dato);

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    160
    Ah quindi tu dici, ad esempio, per questo campo int NumFields di fare così:

    htonl(NumFields);

    e così via per ogni campo della struttura? Dopodiché inserisco tutto con la fwrite?

  6. #6
    Utente di HTML.it L'avatar di ibykos
    Registrato dal
    Feb 2005
    Messaggi
    201
    Perché no? Basta ricordarsi di riconvertire con la funzione opposta quando devi leggere dal file su cui hai salvato la struct.

    Prima ho sbagliato il casting, in realtà la htonl restituisce un uint32_t.
    Inoltre penso che sarebbe meglio utilizzare questi tipi (uint16_t per lo short, uint32_t per int e long) anche nella struct, altrimenti potrebbero esserci problemi di incompatibilità su macchine a 64 bit.

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    160
    Ah ok. Quindi quando creerò una funzione diciamo OpenDatabase() dovrò ricordarmi di usare la funzione inversa. Cmq le funzioni che devo usare sono:

    * htons e ntohs che convertono uno short;
    * htonl e ntohl che convertono un long;

    Però non capisco perché fai il cast. E' proprio necessario? Perché cmq sia è vero che lo devo fare per la portabilità dei dati ma non so se devo farlo portabile anche per i 64bit sinceramente.

  8. #8
    Utente di HTML.it L'avatar di ibykos
    Registrato dal
    Feb 2005
    Messaggi
    201
    Faccio il cast perché sono preciso, ma in realtà penso che nel tuo caso non serva.
    In ogni caso non fare il cast può provocare un problema di rappresenazione, infatti int può contenere valori positivi e negativi mentre uint32_t può contenerli solo positivi (u sta per unsigned), per cui, se nel dato uint32_t è presente un intero di valore troppo grande (caso limite), verrebbe tradotto con un numero negativo nella variabile di tipo int.
    Fare il cast non risolve il problema, ma alcuni compilatori potrebbero segnalare questa fonte di bug.

    Non ho capito se la tua applicazione dovrà girare su macchine molto diverse tra loro (l'uso delle funzioni che lavorano con formati neutri mi fa pensare questo) per cui ti segnalo ancora una sorgente di incompatibilità.
    Alcuni sistemi operativi allineano le struct sui confini delle word, cioè assegnano alla struct una dimensione che non è pari alla somma deelle dimensioni delle variabili interne, ma una dimensione maggiore di questa che sia un multiplo della word.
    Faccio un esempio: ho una scheda madre a 32 bit e definisco una struct che contiene un intero (4 bytes) e un char (1 bytes), alcuni sistemi assegnano la dimensione della struct pari a 5 bytes, altri a 8 bytes, perché la lunghezza di una word di una scheda a 32 bit è di 4 bytes.

    Spero di essere stato utile.
    ciao.

  9. #9
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301

    Moderazione

    Ho modificato il titolo della discussione in quanto non era particolarmente significativo.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  10. #10
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    160
    Ok ho capito il tuo discorso, ma non credo che mi debba preoccupare di tutte queste cose. Cmq proverò e ti faccio sapere se va tutto bene. Grazie ancora

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.