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 structures avec tableau ?


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 112
    Points : 44
    Points
    44
    Par défaut Comparaison de structures avec tableau ?
    Existerait-il un moyen d'avoir un tableau d'une structure ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct Tableau
    {
           long a, b;
    };
     
    struct Tableau tableau[10];
    Cet exemple ne suffit pas, ça compile mais l'application plante.

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Déjà, en C++, le deuxième struct n'est pas utile. Ensuite, ton exemple devrait marcher. Du moins tel quel, ça marche.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 112
    Points : 44
    Points
    44
    Par défaut
    C'est vrai, je l'avais déclaré en locale, voilà pourquoi ça plantait, merci.


    Mais maintenant j'ai un autre problème, la comparaison entre deux structures avec la position du tableau ne veut pas compiler :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    struct Tableau
    {
           long a, b;
    };
     
    Tableau tableau[10];
     
     
    int main()
    {
        if (tableau[0] == tableau[1])
        {
        }
    }
    J'utilise Dev-c++.

    Il existe un moyen de contourner ce problème ?


    EDIT : Le message du compilateur : no match for 'operator==' in 'tableau[0] == tableau[1]'

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Normal, il n'y a pas d'opérateur == défini par défaut pour les structures en c++. Il faut en définir un à la main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    bool operator==(Tableau const& t1, Tableau const& t2)
    {
    ...
    }

  5. #5
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Ben oui, c'est simple, il faut définir un opérateur de comparaison, il ne peut pas savoir comment le faire tout seul !

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 112
    Points : 44
    Points
    44
    Par défaut
    Oulà, c'est drôlement compliqué tout ça.

    Je croyais qu'une structure marchait comme une variable.


    J'ai jamais vu de "operator" dans un code encore, donc je comprends pas comment marche la fonction.


    Sylvain Togni, sur cette fonction, const &t1 et const &t2 sont deux références comparées si je comprends bien, mais ça ne fausse pas les autres utilisations classiques de l'opérateur "==" dans le code ?



    EDIT : J'ai essayé le code, il compile mais le test échoue toujours que les deux valeurs soient identiques ou non...

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    #include <cstdlib>
    #include <iostream>
     
    using namespace std;
     
     
    struct Tableau
    {
           long a, b;
    };
     
    Tableau tableau[10];
     
     
    bool operator==(Tableau const& t1, Tableau const& t2)
    {
    }
     
     
    int main()
    {
        tableau[0].a = 2;
        tableau[0].b = 7;
     
        tableau[1].a = 2;
        tableau[1].b = 7;
     
     
        if (tableau[0] == tableau[1])
        {
            cout << "Test positif" << endl;
            system("pause");
        }
     
        else
        {
            cout << "Test negatif" << endl;
            system("pause");
        }
    }

  7. #7
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Ben, faut tout de même mettre le code de la comparaison si tu veux qu'il se passe quelque chose ! D'ailleurs, tu as un beau warning, là.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 112
    Points : 44
    Points
    44
    Par défaut
    Pourrais-tu m'en dire plus ?


    Je ne vois vraiment pas ce qu'il faudrait faire à ce code.

  9. #9
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Je ne vais pas te le donner, je propose de te demander simplement qu'est ce que l'opérateur de comparaison doit faire pour que ça marche.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 112
    Points : 44
    Points
    44
    Par défaut
    Si je le mets dans main(), ça ne compile pas.

    J'ai pas la moindre base, je trouve rien de compréhensible en recherchant "operator" sur google, j'aurais plus de chance de gagner au loto que de trouver la bonne combinaison à faire pour que ce code marche.


    Si je le fais avec un long, ça marche normalement, pourtant je n'utilise pas une fonction bizarre avec "bool" pour le faire, ça compile, ça ne plante pas et le test marche.

    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
    24
    25
    26
    #include <cstdlib>
    #include <iostream>
     
    using namespace std;
     
     
    long tableau[10];
     
    int main()
    {
        tableau[0] = 2;
        tableau[1] = 2;
     
     
        if (tableau[0] == tableau[1])
        {
            cout << "Test positif" << endl;
            system("pause");
        }
     
        else
        {
            cout << "Test negatif" << endl;
            system("pause");
        }
    }
    Pourquoi ça ne marche pas pareil avec un tableau de structure ?

  11. #11
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Parce que pour un teableu, l'opérateur == n'est pas défini. Donc tu dois le coder toi-même pour savoir comment comparer tes 2 strustures. cf mes premiers posts.

    Si tu n'arrives pas à faire cela, je te conseille de te replonger dans un bon livre de C++.

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 112
    Points : 44
    Points
    44
    Par défaut
    Ça doit être un oublie dans une bibliothèque, si ça marche pas normalement, j'imagine.

  13. #13
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Non, c'est un bout de code que tu as oublié d'écrire. Comme tu ne sais pas pour l'instant faire une fonction de comparaison simple, je te conseille vivement de lire un cours de C++ - http://c.developpez.com/cours/#cours-cpp -

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 112
    Points : 44
    Points
    44
    Par défaut
    Comme la devinette n'est pas mon truc, je contourne finalement ce problème avec une méthode de singe, mais au moins ça marche, ça :


    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    #include <cstdlib>
    #include <iostream>
     
    using namespace std;
     
     
    struct Tableau
    {
           long a, b;
    };
     
    Tableau tableau[10];
     
     
     
    /*bool operator==(Tableau const& t1, Tableau const& t2)
    {
           //Truc qui sert à rien.
    }*/
     
     
    int main()
    {
        tableau[0].a = 2;
        tableau[0].b = 7;
     
        tableau[1].a = 2;
        tableau[1].b = 7;
     
     
        bool compareA = 0, compareB = 0;
        int compare = 0;
     
     
        compareA = tableau[0].a == tableau[1].a;
        compareB = tableau[0].b == tableau[1].b;
     
        compare = compareA + compareB;
     
     
        if (compare == 2)
        {
            cout << "Test positif" << endl;
            system("pause");
        }
     
        else
        {
            cout << "Test negatif" << endl;
            system("pause");
        }
    }
    Merci d'avoir essayé de m'aider !

  15. #15
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 174
    Points
    1 174
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    bool operator==(Tableau const& t1, Tableau const& t2)
    {
           return t1.a == t2.a && t1.b == t2.b;
    }
    en gros c'est l'idée. Est-ce que tu comprends l'intérêt?

    sinon pour ton code au dessus, les booléens en C++ sont égaux à true ou false, pas 1 ou 0. A part ça, ce que tu as fait euh..

    au pire tu faisais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      if( tableau[0].a == tableau[1].a && 
          tableau[0].b == tableau[1].b )
      {
         // ...
      }

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 112
    Points : 44
    Points
    44
    Par défaut
    Je ne vois pas trop le vrai intérêt, ce qu'on gagne à le mettre dans une fonction, mais surtout, je ne comprends pas du tout comment on peut appeller cette fonction sans nom.

  17. #17
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Lis un cours de C++ stp.

  18. #18
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 370
    Points : 40 164
    Points
    40 164
    Par défaut
    Peut-être qu'un petit tour sur la FAQ , partie surcharge d'opérateurs pourrait servir ...

    Qu'est ce que la surcharge d'opérateur ?
    Quel est l'avantage de surcharger un opérateur ?

    et dans ton cas, il s'agit de surcharger l'opérateur ==

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 112
    Points : 44
    Points
    44
    Par défaut
    C'est frustrant mais je n'y comprends vraiment rien, quant au tutoriels, c'est encore pire.

    Heureusement qu'il y a la technique grossière sinon j'aurais pas beaucoup avancé depuis le temps.

  20. #20
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Je vais tenter une autre approche. Quand on défini la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    A operator== (B const &b, C const &C);
    On défini une fonction comme les autres, qui a comme nom operator==. On peut l'appeler ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    B b;
    C c;
    A a = operator==(b, c);
    Pour l'instant, rien ne change par rapport à si j'avais appelé ma fonction f au lieu de operator==. Par contre, lui avoir donné ce nom me permet aussi d'écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    B c;
    C c;
    A a = b == c;
    Les deux codes sont équivalents. Maintenant, il y a un certain nombre de fonctions standard qui aimeraient bien faire == sur des types définis par l'utilisateur, mais par défaut, il ne sais pas comment faire pour calculer a == b avec a et b d'un type utilisateur. Il faut donc lui indiquer. Comme en général le résultat d'une telle comparaison est un booléen, il faut donc pour ça définir la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    bool operator==(MonType a, MonType b);

Discussions similaires

  1. StructLayout : structure avec tableau
    Par tyarcaouen dans le forum C#
    Réponses: 3
    Dernier message: 29/09/2008, 01h01
  2. petite base de donnée avec structure ou tableau?
    Par progbase dans le forum Débuter
    Réponses: 5
    Dernier message: 07/04/2008, 16h03
  3. structure avec tableau multidimentionnel
    Par Alternative451 dans le forum Débuter
    Réponses: 2
    Dernier message: 29/03/2008, 23h41
  4. Allocation d'une structure avec tableau
    Par line86 dans le forum C
    Réponses: 5
    Dernier message: 02/10/2007, 12h38
  5. Réponses: 2
    Dernier message: 12/05/2007, 02h57

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