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 :

Probléme d'alignements de données


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 94
    Par défaut Probléme d'alignements de données
    bonjour à tous et à toutes ,


    j'ai des erreurs dans un projet en C qui m'affiche des erreurs à la compilation dont voici l'erreur pour ceux qui comprennet anglais.

    C C++ Word Alignement :
    http://www.cs.umd.edu/class/sum2003/...a/aligned.html



    le Tableau de données est passer en aruguments à la fonction Appliquer , mais suite à de probléme d'alignement de données dans la mémoire j'ai toujours ce type de message

    fatal error at line 263 it's not a Word Aligned .
    incorrectly aligned pointer (word alignment expected)


    Si je change de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     (&donnee[i+9], var1,var2);
    A
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     (&donnee[0x20]+i+9, var1,var2);
    Aucune erreur de Word Aligned mais le résultat est faux .

    le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    int fonction ( byte *var1 , byte var2)
     
    {
     
    byte donnee [0x20]={
    0xEB, 0x37, 0x8B, 0x45, 0xFC, 0x8B, 0x00, 0x40, 0x8B, 0x15, 0xE4, 0x73, 0x54, 0x00, 0x0F, 0xB7, 0x92, 0xD4, 0x19, 0x00, 0x00, 0x3B, 0xC2, 0x7E, 0x61, 0xA1, 0x74, 0x7C, 0x54, 0x00, 0xE8, 0x4A, 
    };
     
     
     
    // on apelle la fonction appliquer
     
    appliquer(&donnee[i+9], var1,var2);
    memcpy(&donnee[i+20],0x20);
     
     
     
    return 0;
     
     
     
    }


    j'ai des erreurs de Word Aligned dans ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     (&donnee[i + 9], var1,var2);
    Par contre si je change la ligne à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     (&donnee[0x20]+ i + 9, var1,var2);
    Ceci n'affiche pas d'erreurs mais le résultat afficher est incorrect à l'ecran .


    Merci de vos différents conseils conçernant ce probléme .

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Jao,

    Le nom d'un tableau est l'adresse de son 1er élément, donc le & est de trop dans l'appel des fonctions appliquer et memcpy.

    Pour memcpy, es-tu sûr que c'est bien ça que tu veux faire ?

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 94
    Par défaut
    Citation Envoyé par droggo Voir le message
    Jao,

    Le nom d'un tableau est l'adresse de son 1er élément, donc le & est de trop dans l'appel des fonctions appliquer et memcpy.

    Pour memcpy, es-tu sûr que c'est bien ça que tu veux faire ?
    salut droggo

    j'ai enlever l'opérateur d'adressage et d'indiréction mais le résultat est faux à l'ecran .

    Pour memcpy, es-tu sûr que c'est bien ça que tu veux faire ?
    oui Memory Copy (memcpy).
    memcpy = Copy block of memory (function)

  4. #4
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Mae,
    Citation Envoyé par Marley_T Voir le message
    Pour memcpy, es-tu sûr que c'est bien ça que tu veux faire ?
    oui Memory Copy (memcpy).
    memcpy = Copy block of memory (function)
    Le problème n'est pas que tu utilises cette fonction, mais les paramètres que tu utilises pour l'appeler, qui d'ailleurs ne correspondent pas à la déclaration de la fonction (à moins que ce soit une de tes fonctions personnelles, auquel cas il faut éviter de lui donner le nom d'une fonction standard).

  5. #5
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Attention, la fonction memcpy de la librairie C attend 3 paramètres, voir ici : http://www.linux-kheops.com/doc/man/.../memcpy.3.html.
    Ou alors comme le dit droggo, c'est une fonction à toi et à ce moment là, le nom est très mal choisi (risque de collision avec la librairie C et surtout risque d'induire le lecteur en erreur) et il faut le changer.

    D'autre part, ton problème provient de l'appel à la fonction appliquer(). Quel est sont prototype ? Si le premier paramètre appelé par cette fonction est un pointeur sur 2 ou 4 octets (short, long, int, ...), c'est sûr que tu as un problème d'allignement car l'adresse d'un short ou int ne doit pas être impaire.

    C'est pour cela que "(&donnee[i + 20], var1,var2);" marche bien car c'est pair alors que "(&donnee[i + 9], var1,var2);" ne marche pas car c'est impair.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  6. #6
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 94
    Par défaut
    Citation Envoyé par ram_0000 Voir le message
    Attention, la fonction memcpy de la librairie C attend 3 paramètres, voir ici : http://www.linux-kheops.com/doc/man/.../memcpy.3.html.
    Ou alors comme le dit droggo, c'est une fonction à toi et à ce moment là, le nom est très mal choisi (risque de collision avec la librairie C et surtout risque d'induire le lecteur en erreur) et il faut le changer.

    D'autre part, ton problème provient de l'appel à la fonction appliquer(). Quel est sont prototype ? Si le premier paramètre appelé par cette fonction est un pointeur sur 2 ou 4 octets (short, long, int, ...), c'est sûr que tu as un problème d'allignement car l'adresse d'un short ou int ne doit pas être impaire.

    C'est pour cela que "(&donnee[i + 20], var1,var2);" marche bien car c'est pair alors que "(&donnee[i + 9], var1,var2);" ne marche pas car c'est impair.


    salut ram_0000

    La fonction Appliquer () en effet contient la variable donnee aussi qui est déclarer en tant que unsigned char *donnee .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    int appliquer ( unsigned char * donner )
    {
     
    /*  Cors de la focntion  */
     
    }

    Ensuite lors de l'appel de la fonction Appliquer dans une autre on utilise
    l'opérateur d'adressage '&'.



    le probléme principale est la l'alignement de données en mémoire dans le PC
    je n'utlise pas d'autres focntions personnels car le code est trés simple d'utilisation .

    Je souhaite parcourir de la tableau avec une boule ensuite à partir de l'Index avancer de 9 OCTETS le code suivant afficher des erreurs .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (&donnee[i+9], var1,var2);
    Par contre lorsque je mets la taille du tab qui est 0x20 ceci passe sans erreur mais le résultat est faux .


    Donc , soit un résultat faux et sans erreurs de Word Alligned .
    Soit une erreur de incorrectly aligned pointer (word alignment expected)

    Ce code passe sans erreur mais résultat = 0;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Appliquer(&donnee[0x20]+i+9, var1,var2);
    l'algorithme qui doit étre utiliser et afficher le BON résultat est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (&donnee[i+9], var1,var2);
    mais contient des erreurs d'allignement de données .

  7. #7
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par droggo Voir le message
    Le nom d'un tableau est l'adresse de son 1er élément, donc le & est de trop dans l'appel des fonctions appliquer et memcpy.
    Non le & est correct. En effet il n'utilise pas &donnee mais &donnee[i+20], il prends donc l'adresse de 20+i ème élément (ce qui est équivalent à donnee+i+20)

  8. #8
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 94
    Par défaut
    Citation Envoyé par gl Voir le message
    Non le & est correct. En effet il n'utilise pas &donnee mais &donnee[i+20], il prends donc l'adresse de 20+i ème élément (ce qui est équivalent à donnee+i+20)

    salut gl

    Tout à fait gl ,mais je prends le 9 éme la_foncntion(&donnee[i+9]).
    0x20 c'est la taille du tableau

    l'algorithme qui doit étre utiliser est (&donnee[i+9],var1,var2);
    Mais le probléme j'ai depuis hier soir une erreur qui m'empéche de voir le résultat obtenu à l'ecran avec une erreur de word alignment expected.

    Par contre ce code (&donnee[0x20]+i+9 ); passe sans aucune erreur mais le résultat est faux .


    le code qui affiche le bon résultat est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    i=0;
     
    while(i < 5)
    	{
    	switch (donnee[i])
    	{
    	case :0		
              {
    	Appliquer(&donnee[i+9]); 		
    		}

    Mais y'a une erreur de Word Alignement .

    Par contre ce code passe sans probléme MAIS résultat = faux .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
     
    i=0;
     
    while(i < 5)
    	{
    			switch (donnee[i])
    			{
    			case :0		
     
    			{
    		Appliquer(&donnee[0x20]+i+9); //  fonction appliquer
                   // Appliquer(donnee+i+9) // pareil résultat faux MAIS pas d'erreur
                      de Word Alignement .
                            }

  9. #9
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Jae,
    Citation Envoyé par gl Voir le message
    Non le & est correct. En effet il n'utilise pas &donnee mais &donnee[i+20], il prends donc l'adresse de 20+i ème élément (ce qui est équivalent à donnee+i+20)
    Oui, j'ai lu un peu trop vite.

    Citation Envoyé par Marley_T Voir le message
    Par contre ce code (&donnee[0x20]+i+9 ); passe sans aucune erreur mais le résultat est faux .
    Tu prends une adresse qui est déjà hors de ton tableau, et tu lui ajoutes encore i+9.
    Où penses-tu être dans la mémoire ?

    Que ça compile sans erreur ne signifie rien : le compilateur attend une adresse, tu lui en donne une...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [V5] Problème d' alignement de données tableau
    Par gaugau3000 dans le forum Deski
    Réponses: 4
    Dernier message: 11/04/2009, 22h00
  2. [Designer] Problème de transfert de données entre modul
    Par BILLYPATOU dans le forum Designer
    Réponses: 11
    Dernier message: 09/03/2004, 18h15
  3. Problème de rafraîchissement de données...
    Par Alain Dionne dans le forum Bases de données
    Réponses: 3
    Dernier message: 06/03/2004, 21h07
  4. [Interbase 7] Problème d'insertion de données
    Par Tuscelan dans le forum InterBase
    Réponses: 12
    Dernier message: 19/11/2003, 22h58
  5. problème xsl : inclure une donnée xml dans une balise html
    Par djodjo dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 03/01/2003, 09h24

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