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 :

Comparaison de 2 tableaux unsigned char de façon plus "jolie"


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 40
    Points : 20
    Points
    20
    Par défaut Comparaison de 2 tableaux unsigned char de façon plus "jolie"
    Voilà le problème, je souhaite comparer deux tableaux de type unsigned char (qui sont de même longueur) pour savoir si y sont égaux.

    Bon, vu que mes deux tableaux ne sont pas des chaînes de caractères, pas possible d'utiliser strcmp() donc je peux comparer en faisant un truc du style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    unsigned char tabX[3];
    unsigned char tabY[3];
     
    if((tabX[0]==tabY[0])&&(tabX[1]==tabY[1])&&(tabX[2]==tabY[2]))
        printf("les deux tableaux sont égaux\n");
    else
        printf("tableaux differents\n");
    Bon ça marche, mais je pense qu'il existe une solution plus jolie et moins à l'arrache donc si quelqu'un pouvait me la communiquer...

    Merci d'avance!

  2. #2
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 864
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 864
    Points : 3 438
    Points
    3 438
    Par défaut
    Salut,

    Connais-tu la boucle for ?

  3. #3
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Bonjour,

    tu peux utiliser une boucle for et dés qu'il y a une différence, tu mets une variable à 0 (false) :
    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 i;
    int equal = 1;
    unsigned char tabX[3];
    unsigned char tabY[3];
    size_t n = sizeof (tabX) / sizeof (*tabX);
     
    for (i = 0; i < n; i++)
    {
      if (tabX[i] != tabY[i])
      {
        equal = 0;
        break;
      }
    }
     
    if (equal)
    {
      printf ("les deux tableaux sont égaux\n");
    }
    else
    {
      printf ("tableaux differents\n");
    }

  4. #4
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 40
    Points : 20
    Points
    20
    Par défaut
    Parfait, merci beaucoup...

    J'avoue ne pas avoir réfléchit à la boucle for, désolé.

  5. #5
    Membre averti
    Profil pro
    Responsable technique
    Inscrit en
    Février 2006
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable technique

    Informations forums :
    Inscription : Février 2006
    Messages : 364
    Points : 353
    Points
    353
    Par défaut
    Et au passage si tu veux te casser la tete et utiliser strcmp, tu declare tes tableau d'une longueur de 4 et tu rajoute le caractere '\0' une fois tes tableaux rempli :p

  6. #6
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 864
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 864
    Points : 3 438
    Points
    3 438
    Par défaut
    Citation Envoyé par drcd
    Et au passage si tu veux te casser la tete et utiliser strcmp, tu declare tes tableau d'une longueur de 4 et tu rajoute le caractere '\0' une fois tes tableaux rempli :p
    Ou bien tu testes les deux dernières cases des tableaux, et si elles sont égales, tu les remplaces par '\0' puis strcmp

  7. #7
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 864
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 864
    Points : 3 438
    Points
    3 438
    Par défaut
    Citation Envoyé par the_ionic
    Parfait, merci beaucoup...

    J'avoue ne pas avoir réfléchit à la boucle for, désolé.
    C'est pas grave, ça peut arriver Je n'ai pas écrit le code, car c'est plutot simple à implémenter et que tu en gagnerais en plaisir personnel, de faire ton propre programme comme tu l'entends, sans copier/coller

    Es-tu débutant en C ?

    A+

  8. #8
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 40
    Points : 20
    Points
    20
    Par défaut
    Jsuis pas forcément débutant en C, ça fait pas mal de temps que j'en ai pas fait en fait, et quand j'écris un truc un peu moche comme ce que j'avais écrit, je me pose toujours la question de savoir si y'a pas un truc un peu plus jolie ou simple.

    J'avais pensé à rajouter le caractère '\0' à la fin de mon tableau pour les transformer en chaine et utiliser strcmp mais ça n'avait pas marché, j'avais du faire une connerie.

    Pour la boucle for, aucun problème, j'aurais réussi sans qu'on m'écrive le code, jsuis pas fort mais quand même Je voulais juste dire que j'avais pas pensé au for en fait au moment de faire mon truc!

    Merci à tous!

  9. #9
    Membre averti
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Points : 387
    Points
    387
    Par défaut
    Hello,

    Citation Envoyé par the_ionic
    Voilà le problème, je souhaite comparer deux tableaux de type unsigned char (qui sont de même longueur) pour savoir si y sont égaux.

    Bon, vu que mes deux tableaux ne sont pas des chaînes de caractères, pas possible d'utiliser strcmp() donc je peux comparer en faisant un truc du style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    unsigned char tabX[3];
    unsigned char tabY[3];
     
    if((tabX[0]==tabY[0])&&(tabX[1]==tabY[1])&&(tabX[2]==tabY[2]))
        printf("les deux tableaux sont égaux\n");
    else
        printf("tableaux differents\n");
    Bon ça marche, mais je pense qu'il existe une solution plus jolie et moins à l'arrache donc si quelqu'un pouvait me la communiquer...

    Merci d'avance!
    Hé bé... memcmp(), personne n'en a encore parlé !! Malgré que ce soit dans string.h, c'est fait pour...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <stdio.h>
    #include <string.h>
     
    [...]
     
    if ( ! memcmp(tabX, tabY, sizeof(tabY)/sizeof(tab*Y) ) ) {
       puts("les deux tableaux sont égaux");
    }
    else {
       puts("tableaux differents");
    }
     
    [...]
    A+

  10. #10
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 40
    Points : 20
    Points
    20
    Par défaut
    Hé bé... memcmp(), personne n'en a encore parlé !! Malgré que ce soit dans string.h, c'est fait pour...
    Voilà, en fait, quand je voulais une solution, c'était plus un truc du genre, qui fasse moins bricolage... et du coup memcmp(), ça a quand même plus de gueule que le for (qui lui avait nettement plus de gueule que mes pauvres if!!!)

    Merci beaucoup.

  11. #11
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 864
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 864
    Points : 3 438
    Points
    3 438
    Par défaut
    Ca t'oblige à inclure string.h; Comme strcmp tu me diras.

    Le plus optimisé reste la boucle for, car tu pourras sortir de ta boucle au premier élément différent rencontré. memcmp fait une comparaison sur l'ensemble des éléments, me semble-t-il

    A+

  12. #12
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 40
    Points : 20
    Points
    20
    Par défaut
    Le plus optimisé reste la boucle for, car tu pourras sortir de ta boucle au premier élément différent rencontré. memcmp fait une comparaison sur l'ensemble des éléments, me semble-t-il
    Oui alors c'est à prendre en compte... toujours ce compromis entre simplicité du code et efficacité. Rahlala, le jour ou j'aurais compris tout ça, je crois que je serais heureux!

  13. #13
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Comme la taille des tableaux est 3, la différence peut être considérée comme négligeable, je pense.

  14. #14
    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
    Oui, le mieux serais de procéder à des tests avec chronométrage sur des tableaux de plusieurs centaines d'indices pour réellement voir les différences

  15. #15
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 864
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 864
    Points : 3 438
    Points
    3 438
    Par défaut
    Citation Envoyé par Trap D
    Comme la taille des tableaux est 3, la différence peut être considérée comme négligeable, je pense.
    J'imagine que c'était un exemple non ?

    Sinon, si c'est de taille 3 invariable, le premier bout de code est le plus optimisé ! Car comme mon petit maitre tibetain disais : Pas de boucle, beaucoup plus rapide !

    Euh attendez... c'était en référence à ma ceinture noire de moine shaolin ! C'est plus rapide pour les coups de pieds, sans boucle.

  16. #16
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 864
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 864
    Points : 3 438
    Points
    3 438
    Par défaut
    Citation Envoyé par Franck.H
    Oui, le mieux serais de procéder à des tests avec chronométrage sur des tableaux de plusieurs centaines d'indices pour réellement voir les différences
    Pas besoin de test : memcmp fait FORCEMENT un parcours des données bytes du tableau à la manière d'un for, et des comparaisons d'inégalités à la fin ( pour savoir si c'est supérieur / inférieur )

    A+

  17. #17
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par KiLVaiDeN
    Pas besoin de test : memcmp fait FORCEMENT un parcours des données bytes du tableau à la manière d'un for, et des comparaisons d'inégalités à la fin ( pour savoir si c'est supérieur / inférieur )
    Pas forcement, tu t'arrête au premier caractère différent. Je pense que memcmp doit être plus rapide (surtout s'il est codé en assembleur).
    Fearyourself tu pourrais nous faire un p'tit test de comparaison ?

  18. #18
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 864
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 864
    Points : 3 438
    Points
    3 438
    Par défaut
    Citation Envoyé par gege2061
    Pas forcement, tu t'arrête au premier caractère différent. Je pense que memcmp doit être plus rapide (surtout s'il est codé en assembleur).
    Fearyourself tu pourrais nous faire un p'tit test de comparaison ?
    Oui en assembleur, c'est sûr, en plus si on travail en mémoire...

    Mais si c'est du C, ça reste une comparaison et non une inégalité, ce qui est un petit poil plus lent si je ne m'abuse ! Dites moi si j'ai tort !

    o_O

  19. #19
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 40
    Points : 20
    Points
    20
    Par défaut
    Pinaize, j'arrive à être à moitié perdu dans un sujet que j'ai lancé moi!

    Bon pour répondre à la question, c'est bien un tableau fixe de 6 éléments (c'est en fait une comparaison d'adresses MAC) mais bon, le débat m'interessait alors j'avais pas précisé.
    D'ailleurs si quelqu'un à une réponse sur qui qu'est plus rapide entre le memcmp et le for (oui je sais, ça dépends grandement de la taille du tableau et dans mon cas c'est négligeable mais bon, on sait jamais, le cas peut se représenter à moi).
    Merci!

  20. #20
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 864
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 864
    Points : 3 438
    Points
    3 438
    Par défaut
    Citation Envoyé par the_ionic
    Pinaize, j'arrive à être à moitié perdu dans un sujet que j'ai lancé moi!

    Bon pour répondre à la question, c'est bien un tableau fixe de 6 éléments (c'est en fait une comparaison d'adresses MAC) mais bon, le débat m'interessait alors j'avais pas précisé.
    D'ailleurs si quelqu'un à une réponse sur qui qu'est plus rapide entre le memcmp et le for (oui je sais, ça dépends grandement de la taille du tableau et dans mon cas c'est négligeable mais bon, on sait jamais, le cas peut se représenter à moi).
    Merci!

    Le plus rapide c'est le if, avec les conditions ordonnées de la plus improbables vers la plus probable

    Ainsi, ton if va évaluer de gauche à droit, et dès qu'il trouvera une condition fausse, étant donné que tu fais des &&, il va sortir de la condition. Avec une boucle for, tu fais appel à une routine de bouclage, qui n'est pas nécessaire pour si peu de valeurs, surtout si c'est un nombre de valeurs fixes.

    Mais pourquoi seulement 6 adresses MAC à comparer ? Es-tu sûr que ça n'évoluera jamais ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. PL/SQL COMPARAISON DE DEUX TABLEAUX APRES BULK
    Par mimi_été dans le forum PL/SQL
    Réponses: 5
    Dernier message: 30/06/2009, 13h14
  2. Réponses: 6
    Dernier message: 06/10/2005, 12h30
  3. Décalage de bit sur unsigned char [8]
    Par dboulange dans le forum C++
    Réponses: 14
    Dernier message: 26/07/2005, 15h10
  4. Réponses: 19
    Dernier message: 28/04/2005, 16h36
  5. char et unsigned char
    Par jobherzt dans le forum C++
    Réponses: 8
    Dernier message: 11/02/2005, 01h24

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