[Débutant] Modification d'une structure
Bonjour, je suis en train de suivre les exercices du livre de Claude Delannoy "Exercices en langage C++" et je bloque deja au 5eme exercice :lol:
L'exercie 4 demandait d'ecrire deux fonctions permettant d'intervertir la valeur de deux variables en utilisant une fonction utilisant l'adresse des variables et l'autres les references.
Voici ma solution :
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
|
1 #include <iostream>
2 using namespace std;
3
4 main() {
5 void echangec(int *, int *);
6 void echangeref(int &, int &);
7
8 int a, b;
9 cout << "Donnez la valeur de A\net ensuite la valeur de B.\n";
10 cin >> a >> b;
11 cout << "Valeur de A: " << a << "\nValeur de B: " << b << "\n";
12
13 cout << "Appel de la 1ere fonction d'inversion.\n";
14 echangec(&a, &b);
15 cout << "Valeur de A: " << a << "\nValeur de B: " << b << "\n";
16
17 cout << "Appel de la 2nde fonction d'inversion.\n";
18 echangeref(a, b);
19 cout << "Valeur de A: " << a << "\nValeur de B: " << b << "\n";
20
21 }
22
23 void echangec(int * a, int * b) {
24 int c;
25 c = *a;
26 *a = *b;
27 *b =c;
28 }
29
30 void echangeref(int & a, int & b) {
31 int c;
32 c = a;
33 a = b;
34 b = c;
35 } |
L'exercie 5 demande grosso modo la même chose. Une structure est déclarée :
Code:
1 2 3 4 5 6
|
struct essai
{
int n;
float x;
}; |
et je dois ecrire deux fonctions qui remettent les valeurs à 0.
Voici ce que j'ai tenté (avec d'autres essais bien entendu) :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
1 #include <iostream>
2 using namespace std;
3
4 main()
5 {
6 void razc(struct *);
7
8 struct essai
9 {
10 int n;
11 float x;
12 };
13
14 }
15
16 void razc(struct * essai)
17 {
18 cout << essai->n;
19 } |
Et voici les messages d'erreurs à la compilation :
Citation:
Envoyé par g++ -o test structraz.cpp
structraz.cpp: In function `int main()':
structraz.cpp:6: error: syntax error before `)' token
structraz.cpp: At global scope:
structraz.cpp:16: error: syntax error before `essai'
structraz.cpp: In function `void razc(...)':
structraz.cpp:18: error: `essai' undeclared (first use this function)
structraz.cpp:18: error: (Each undeclared identifier is reported only once for each function it appears in.)
J'avoue ne pas comprendre d'ou vient mon erreur et je vous remercie d'avance pour vos réponses.
PS:
Citation:
Envoyé par gcc --version
gcc (GCC) 3.3.6 (Gentoo 3.3.6, ssp-3.3.6-1.0, pie-8.7.8 )
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Re: [Débutant] Modification d'une structure
Citation:
Envoyé par kyu
Code:
1 2 3 4 5 6
| 1 #include <iostream>
2 using namespace std;
3
4 main() {
5 void echangec(int *, int *);
6 void echangeref(int &, int &); |
Je n'ai vu ce genre de declarations de fonctions a l'interieur d'une autre fonction que dans du vieux code C. Ce n'est plus du tout idiomatique en C, ce ne l'a jamais ete en C++. Delannoy n'a pas une tres bonne reputation et je commence a me demander si elle n'est pas meritee.
Citation:
Envoyé par kyu
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| 1 #include <iostream>
2 using namespace std;
3
4 main()
5 {
6 void razc(struct *);
7
8 struct essai
9 {
10 int n;
11 float x;
12 };
13
14 }
15
16 void razc(struct * essai)
17 {
18 cout << essai->n;
19 } |
Place tes declarations en dehors des fonctions.
Place tes declarations dans un ordre tel que ce qui est utilise est declare avant l'utilisation.
struct essai {...}; declare un type nomme essai. Ensuite tu peux utiliser essai pour designer ce type exactement comme tu utilises int.
Si Delannoy ne fait ne fut-ce que suggerer d'utiliser une declaration comme
Code:
void razc(struct essai* obj);
jette le bouquin et cherche un meilleur.
Suivant ton experience en programmation (difficulte decroissante, je n'ai reellement lu que le premier mais les auteurs des deux autres ont bonne reputation).
Stroustrup, The C++ Programming langage. A ete traduit et la traduction a ete corrigee, verifie que tu as la version corrigee.
Koening et Moe. Accelerated C++. Je ne sais pas s'il a ete traduit.
Francis Glassborow. You can do it!. A ete traduit (Je me lance!) mais je ne connais pas la qualite de la traduction. Il y a un errata pour le CD sur son site (http://www.spellen.org/youcandoit/french.htm).