Existerait-il un moyen d'avoir un tableau d'une structure ?
Cet exemple ne suffit pas, ça compile mais l'application plante.Code:
1
2
3
4
5
6 struct Tableau { long a, b; }; struct Tableau tableau[10];
Version imprimable
Existerait-il un moyen d'avoir un tableau d'une structure ?
Cet exemple ne suffit pas, ça compile mais l'application plante.Code:
1
2
3
4
5
6 struct Tableau { long a, b; }; struct Tableau tableau[10];
Déjà, en C++, le deuxième struct n'est pas utile. Ensuite, ton exemple devrait marcher. Du moins tel quel, ça marche.
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 :
J'utilise Dev-c++.Code:
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]) { } }
Il existe un moyen de contourner ce problème ?
EDIT : Le message du compilateur : no match for 'operator==' in 'tableau[0] == tableau[1]'
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:
1
2
3
4 bool operator==(Tableau const& t1, Tableau const& t2) { ... }
Ben oui, c'est simple, il faut définir un opérateur de comparaison, il ne peut pas savoir comment le faire tout seul !
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:
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"); } }
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à.
Pourrais-tu m'en dire plus ?
Je ne vois vraiment pas ce qu'il faudrait faire à ce code. :?
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.
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.
Pourquoi ça ne marche pas pareil avec un tableau de structure ?Code:
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"); } }
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++.
Ça doit être un oublie dans une bibliothèque, si ça marche pas normalement, j'imagine.
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 -
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 :
Merci d'avoir essayé de m'aider ! :)Code:
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"); } }
en gros c'est l'idée. Est-ce que tu comprends l'intérêt?Code:
1
2
3
4
5 bool operator==(Tableau const& t1, Tableau const& t2) { return t1.a == t2.a && t1.b == t2.b; }
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:
1
2
3
4
5
6 if( tableau[0].a == tableau[1].a && tableau[0].b == tableau[1].b ) { // ... }
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.
Lis un cours de C++ stp.
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 ==
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.
Je vais tenter une autre approche. Quand on défini la fonction :
On défini une fonction comme les autres, qui a comme nom operator==. On peut l'appeler ainsi :Code:A operator== (B const &b, C const &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:
1
2
3 B b; C c; A a = operator==(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:
1
2
3 B c; C c; A a = b == c;
Code:
1
2 bool operator==(MonType a, MonType b);