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 :

Concaténation des données d'un tableau [Débutant(e)]


Sujet :

C

  1. #1
    Nouveau membre du Club
    Inscrit en
    Août 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 42
    Points : 31
    Points
    31
    Par défaut Concaténation des données d'un tableau
    Bonjour,

    voila la question que je me pose : j'ai un tableau d'entiers sur 16 bits contenant 2 éléments que j'ai déclaré comme ci dessous :

    T_Uint16 donnees[2];

    T_Uint16 étant bien entendu un type que j'ai défini auparavant.

    Je voulais savoir comment regrouper les 2 éléments du tableau en un entier de 32 bits? Afin de pouvoir manipuler l'entier de 32 bits.
    Dois-je faire une structure? ou une simple addition suffit-elle?

    par exemple : donnees[0]+donnees[1] ?

    Merci d'avance de votre aide, en esperant avoir été assez clair!

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par SybVicious
    Je voulais savoir comment regrouper les 2 éléments du tableau en un entier de 32 bits? Afin de pouvoir manipuler l'entier de 32 bits.
    Dois-je faire une structure? ou une simple addition suffit-elle?

    par exemple : donnees[0]+donnees[1] ?
    Salut !


    Ce que tu veux faire en fait, c'est une concaténation de deux entier c'est ca ? Si c'est le cas (en adméttant que tu dispose d'un type T_Uint32):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    T_Uint32 resultat = 10 * donnees[0] + donnees[1];

  3. #3
    Membre éclairé Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Points : 790
    Points
    790
    Par défaut
    Tu peux faire une union
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    union{
    T_Uint32 _raw;
    T_Uint16 _tab[2];
    };
    Mais attention à l'endianess. Suivant si tu es sur une machine en little ou en big, _tab[0] sera le LSB ou le MSB respectivement !

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    Bonjour,

    donnees[0] * pow (2, 16) +donnees[1]

    si donnees[0] représente les bits de poids fort par exemple
    et si tu te tiens à cette représentation des données (poids fort puis poids faible). A voir.

    Mais je me demande bien ce que tu veux faire avec ça.

  5. #5
    scr
    scr est déconnecté
    Membre habitué
    Inscrit en
    Juin 2005
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 127
    Points : 143
    Points
    143
    Par défaut
    Tu peux directement calculer la somme dans un entier 32 bits.

    Par contre il faut utiliser un cast pour que la somme soit calculée sur 32 bits

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    DWORD x;
    x=((DWORD)donnees[0])+donnees[1];

  6. #6
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par aoyou
    Mais je me demande bien ce que tu veux faire avec ça.
    En fait, il dispose de deux entiers 16bits et veux en faire un entier 32bits, un peut comme on à la séparation des données dans un registre processeur par exemple. Donc à mon avis ce qu'il veut faire c'est une concaténation des deux données.

    Exemple: Si tu as donnees[0] = 5 et donnees[1] = 9, le but est de fait un entier 32bits qui vaut 59

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    Alors, dans ce cas, multiplier par 10 donnees[0] ne résoud pas le problème.
    Si donnees [1] vaut 99, je n'aurais pas 599 mais 149.

    Attendons que SybVicious nous donne un exemple de ce qu'il veut faire car au vue de la multiplicité des réponses, il y a plusieurs interprétations possibles.

  8. #8
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par aoyou
    Alors, dans ce cas, multiplier par 10 donnees[0] ne résoud pas le problème.
    Si donnees [1] vaut 99, je n'aurais pas 599 mais 149.
    Oui c'est vrai que j'ai donné un exemple très simpliste mais j'avais oublié de préciser que si donnee[0] par exemple possède une valeur supérieure ou égale à 10, tu multiplies alors par 100 et non pas 10 et ainsi de suite

    Maintenant s'il y a plus élégant... ma méthode n'est peut-être pas la plus pratique suivant les cas

  9. #9
    Nouveau membre du Club
    Inscrit en
    Août 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 42
    Points : 31
    Points
    31
    Par défaut
    Bonjour,
    deja merci a tous de votre aide!
    je vais essayer detre plus précis:
    en fait je recupere des données (en l'occurence un compteur) qui est sur 32 bits. Seulement, les données que je récupère sont, comme vous l'avez compris séparés en 2 éléments de tableau de 16 bits. Imaginons que mes donnees soient les suivantes :

    donnees[0]=0000 0101 1000 0100
    donnees[1]=0100 1100 0000 1000

    j'aimerais récuperer un entier sur 32 bits et pouvoir le manipuler dont la valeur est la suivante:

    T_Uint32 = 0000 0101 1000 0100 0100 1100 0000 1000

    je pense que l'union est la bonne solution? ou la reponse de aoyou me semble appropriée également
    qu'en pensez vous ?
    Merci!!!

  10. #10
    scr
    scr est déconnecté
    Membre habitué
    Inscrit en
    Juin 2005
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 127
    Points : 143
    Points
    143
    Par défaut
    oui les deux solutions fonctionnent.

    il me semble quand même qu'un cast est nécessaire pour la solution de aoyou

    pow (2, 16) peut être remplacé par 0xFFFF plutot que de le recalculer a chaque fois

    oups petite correction :

    pow (2, 16) peut être remplacé par 0xFF et non 0xFFFF

    oups encore n'importe quoi

    pow (2,16) = 0x100 et non 0xFF

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    Oui, ce sera plus efficace.

    L'opérateur << l'est peut-être encore plus.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    uint16_t a = 12;
    uint16_t b = 24;
    uint32_t c = (a << 16) + b;
    Compile sans warning avec gcc sous Linux et Windows.

  12. #12
    scr
    scr est déconnecté
    Membre habitué
    Inscrit en
    Juin 2005
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 127
    Points : 143
    Points
    143
    Par défaut
    oui effectivement l'opérateur est plus efficace

    pas besoin de caster alors ?

  13. #13
    scr
    scr est déconnecté
    Membre habitué
    Inscrit en
    Juin 2005
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 127
    Points : 143
    Points
    143
    Par défaut
    En effet pas besoin de caster je viens de tester.

    Je retire toutes les conneries que j'ai raconté...

    Il aurait fallu multiplier par 0x100 et non 0xFF

    Désolé

  14. #14
    Nouveau membre du Club
    Inscrit en
    Août 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 42
    Points : 31
    Points
    31
    Par défaut
    merci beaucoup, je pense que je vais utiliser l'opérateur << qui me semble le plus simple et le plus efficace!
    merci de votre aide!!!

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 25/05/2009, 10h38
  2. [MySQL] Formatage des données dans un tableau
    Par dunbar dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 26/06/2006, 09h52
  3. Réponses: 4
    Dernier message: 17/04/2006, 21h10
  4. [MySQL] Stocker des données dans un tableau
    Par LadyArwen dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 02/02/2006, 11h40
  5. Réponses: 3
    Dernier message: 05/12/2005, 03h30

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