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);
Désolé, j'avais pas vu ta réponse, JolyLoic. Merci d'avoir essayé. :)
Je ne comprends quand même pas pourquoi ça prend la place d'une fonction sans en être une, c'est sûrement un élément simple qui me manque, enfin c'est pas important pour moi maintenant, je préfère ne pas connaître la limite de la patience de ceux qui savent, vu qu'il existe une autre solution tout aussi efficace, bien que sale.
C'est une fonction, la différence c'est juste qu'on peut l'appeler de deux manières différentes : l'appel classique de fonction, ou bien l'écriture simplifiée de l'opérateur.
Salut,
Bon, quand tu écris du code dans genre de
les caractere "==" ">" "+=" s'appellent des opérateurs, ou, si tu préferes, des signes qui permettent d'effectuer certaines opérations entre deux valeurs de meme type (car il est illogique de comparer une pomme à une orange :D) .Code:
1
2
3
4
5
6
7
8
9
10
11 int i; int j; /* ...*/ if(i==j) /*...*/ /*ou */ if(i>j) /* ou */ i+=j; /* etc */
==, >, >=, <, <=, != sont des opérateurs de comparaison, +,-,*,/ et % sont des opérateur mathématiques (je présumes que c'est d'ailleurs de là que vient le terme ;) et &&, ||,^ sont des opérateur logiques;)
Le terme en anglais est sensiblement identique au terme francais: operator.
Et, si tu y penses un tout petit peu, comment appellerais tu "un groupe d'instructon permettant d'effectuer certaines opérations" :question:
La réponse tient en un seul mot: une fonction ;) :D
Ces opérateurs sont disponibles, en natif, pour les types de base ((unsigned) char, (unsigned) short, (unsigned) int, float, double (double), (unsigned) long).
Seulement, voilà, ainsi que l'on a essayé de te le faire comprendre, l'ordinateur est encore plus bete que ma niece de 6 ans, et, si tu ne lui dit pas comment comparer ou effectuer une addition sur une structure, il ne saura purement et simplement pas comment s'y prendre :P
Quand tu écris un test du genre de
tu lui fournis justement la manière qui lui permet de comparer les deux structures (s1 et s2), de meme type, pour savoir si elles sont égales ;)Code:if(s1.a==s2.a && s1.b==s2.b)
Si tu as compris ce que je viens d'écrire, et si tu es d'accord avec tout cela - mais je ne vois pas pourquoi tu ne serais pas d'accord avec ca :D - tu comprendra pourquoi il est, quelque part, logique que quand tu veux créer un opérateur (quel qu'il soit) pour une structure donnée, que tu le fasse en lui donnant la meme forme qu'une fonction ;)
Maintenant, les opérateurs de comparaison fournissent un résultat booléen: c'est vrai ou faux (true ou false).
Il existe un type particulier en C++ qui permet de représenter ce résultat booléen: bool.
Il est donc tout aussi logique que, le type de retour de ta fonction/operateur qui va comparer l'égalité entre deux structures d'un meme type soit... bool :D
(Avis au puristes: je sais tres bien avoir pris quelques raccourcis et n'avoir pas forcément utilisé les bons termes... l'idée était essentiellement de permettre au P.O. de comprendre ;))
Ça s'appelle la surchage d'opérateurs.
Je l'avais déjà utilisé cette fonction bizarre mais sans pouvoir l'appeler, si j'appelle operator(); ça ne compile pas et si j'appelle les paramètres, c'est comme si c'était du vent.
Quelle fonction bizarre ?
Maintenant que j'ai compris la méthode de surcharge d'opérateur, qui n'est qu'une surcharge de fonction opérateur...
Ne serait-il pas préférable, pour la rapidité de traitement, de mettre inline en sachant que je vise à traiter un très grand nombre de lignes ?
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 #include <iostream> #define NBLIGNES 3 struct Tab { long a, b; }; using namespace std; inline bool operator==(Tab const &tabA, Tab const &tabB); int main() { Tab tableau[NBLIGNES]; // remplissage du tableau : tableau[0].a = 2; tableau[0].b = 25; tableau[1].a = 3; tableau[1].b = 35; tableau[2].a = 3; tableau[2].b = 35; // comparaison des éléments du tableau : for (unsigned long i = 0 ; i < NBLIGNES-1 ; i++) { cout << i << " et " << i+1 << " sont "; if (tableau[i] == tableau[i+1]) cout << "identiques" << endl; else cout << "differents" << endl; } system("pause"); return 0; } inline bool operator==(Tab const &tabA, Tab const &tabB) { return tabA.a == tabB.a && tabA.b == tabB.b; }