IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Sauvegarder données à partir und'un pointeur


Sujet :

C

  1. #1
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut Sauvegarder données à partir und'un pointeur
    Bonjour à tous,

    Je ne sais si mon titre est très explicite mais je vais tâché d'être clair au mieux.

    En gros, je dois sauvegarder des informations dans une partie NVM (Non Volatile Memory) afin de récuperer celles ci suite à un crash d'une target.

    Ma première question est la suivante:
    Je crée une struct typedef composée de plusieurs variables de type int, voir même composée d'une autre structure REG_SET. J'enregistre cette structure dans un fichier NVM grâce à la fonction write(). A la relecture de ce fichier, que l'irais je? L'adresse de la structure ou pourrais je récupérer l'ensemble de mes données qui composent cette structure?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    typedef struct tracePostMortem
    {
      	UInt32		taskId;
    //  	REG_SET		registers;
    	UInt32		PC;
    	UInt32		SP;
    	UInt32		FP;
    	UInt32		LR;    
    	UInt32		stackSize;/* size of stack in bytes */
        UInt32		stackCurrent;/* current stack usage in bytes */
        UInt32		stackHigh;/* maximum stack usage in bytes */
    } tracePostMortem;
    Ma deuxième question:
    Je déclare un pointeur, qui contient donc une adresse. Comment puis je enregistrer dans un fichier l'ensemble des valeurs commençant à l'adresse contenue dans le pointeur?
    Faut il sauvegarder info par info dans le fichier, connaître exactement la taille des données pour pouvoir les dumper à la relecture?

    Je vous remercie pour vos futures explications.

    Bonne journée.

    Nicolas

  2. #2
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par homeostasie
    J'enregistre cette structure dans un fichier NVM grâce à la fonction write(). A la relecture de ce fichier, que l'irais je? L'adresse de la structure ou pourrais je récupérer l'ensemble de mes données qui composent cette structure?
    Tout d'abord, utilise fwrite() afin d'etre portable. Ensuite si tu fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    n = fwrite(&my_struct, sizeof struct, 1, f);
    Ton fichier contiendra bien le contenu de ta structure. Ce n'est pas portable pour plusieurs raisons (endianness, bytes d'alignement, configuration du compilateur...). A toi de savoir si c'est un probleme. Evidemment, si la structure contient des pointeurs, l'adresse qu'ils contiennent ne sera plus valide dans un autre run.

    Je déclare un pointeur, qui contient donc une adresse. Comment puis je enregistrer dans un fichier l'ensemble des valeurs commençant à l'adresse contenue dans le pointeur?
    Faut il sauvegarder info par info dans le fichier, connaître exactement la taille des données pour pouvoir les dumper à la relecture?
    Oui. L'adresse contenue dans le pointeur n'est valable que pendant le run en cours. Il faut donc sauvegarder les donnees une par une.

  3. #3
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    Merci pour ces réponses.

    Je vais mettre au point cela. Pour le moment je ne mets pas en résolu, on ne sait jamais je pourrais avoir d'autres questions au moment du codage.

    Nicolas

  4. #4
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    Par rapport à la réponse de Dazumba,

    Je n'ai pas relevé tout à l'heure mais que représente l'endianness et les bytes d'alignement?

    Merci

    Nicolas

  5. #5
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    l'endianness
    C'est la manière dont sont rangés les bytes en mémoire:
    http://fr.wikipedia.org/wiki/Endianness

  6. #6
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par homeostasie
    Je n'ai pas relevé tout à l'heure mais que représente l'endianness et les bytes d'alignement?
    Comme indique ci-dessus, l'endianness est l'ordre dans lequel les octets apparaissent dans une variable de plusieurs octets. Comme il y a deux conventions possibles, les deux ont ete prises par differents constructeurs de micro-processeurs. Un fichier binaire cree sur une machine little-endian (e.g. Intel x86) n'est pas lisible directement sur une machine big-endian (e.g. PowerPC) - il faut inverser les octets et donc connaitre le type des donnees enregistrees.

    Les octets d'alignement sont ajoutes par le compilateur aux structures dont la taille n'est pas un multiple d'un taille donnee, afin d'ameliorer les performances de l'adressage des membres de la structure. Cela depend encore du processeur, mais aussi des options passees au compilateur (on peut empecher l'ajout de ces octets d'alignement).

    Bref, un fichier binaire peut ne pas etre directement lisible sur une machine differente de celle qui l'a cree. Ainsi, on prefere creer des fichiers au format texte brut, utiliser des formats de donnees binaires plus avances, comme XDR, ou encore forcer l'utilisation d'une convention a tous les utilisateurs (les transferts reseaux sont big-endian, par exemple).

Discussions similaires

  1. Réponses: 2
    Dernier message: 31/05/2013, 09h59
  2. Réponses: 4
    Dernier message: 04/11/2009, 11h54
  3. Mettre en place une base de données à partir d'une sauvegarde
    Par snopims dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 16/09/2008, 10h13
  4. Validation de données à partir d'un XML Schema
    Par leup dans le forum Valider
    Réponses: 2
    Dernier message: 10/06/2004, 08h30
  5. Réponses: 8
    Dernier message: 04/09/2003, 16h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo