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 :

[Débutant] Modification d'une structure


Sujet :

C++

  1. #1
    kyu
    kyu est déconnecté
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 6
    Points : 2
    Points
    2
    Par défaut [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

    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 : 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
     
          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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 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
     
          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.

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    c'est struct essai * et non pas struct * essai.
    (et en C++, tu peux directement mettre essai *, sans struct.

    PS: L'échange avec un troisième int, c'est pour les petits joueurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void echangec(int * pt_a, int * pt_b) 
    {
    *pt_a ^= *pt_b;	//*pt_a contient a^b
    *pt_b ^= *pt_a;	//*pt_b contient a^b^b = a
    *pt_a ^= *pt_b;	//*pt_a contient a^b^a = b
    }

  3. #3
    kyu
    kyu est déconnecté
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Eh Oh! on se moque pas des debutants mais merci pour l'astuce

    Quelque chose que je comprend pas, c'est que pour l'exercice 4, j'ai bien utilisé : "int * b" et non "int b *", pourquoi pour les structure je dois utiliser "struct essai *" ?

    Sinon il me reste une erreur avec ce nouveau code :
    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
    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 }
    structraz.cpp: In function `int main()':
    structraz.cpp:6: error: syntax error before `)' token
    C'est une histoire de lvalue ou autre ?

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 17
    Points : 20
    Points
    20
    Par défaut
    salut kyu,

    ton nouveau probleme semble venir de l'appel de fonction dans le main.

    Tout d'abord declare ta struct a l'exterieur du main puis definit une struct dans le main comme ca:
    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
     
    struct essai  {
       int n;
      float x;
     }; 
     
    void razc(essai *myStruct)  {
      std::cout << myStruct->x;
    }
    main() {
      essai *myStruct=new(essai);
      //init des var de struct
      myStruct->x=0;
      myStruct->z = 0.0;
      razc(myStruct);
    }
    Pour definir un poinreur sur ta struct essai tu fais un new
    puis tu initialise les champs de ta struct et tu appelles ta foncti0on d'affichage.

    Voila,
    stef[/code]

  5. #5
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut Re: [Débutant] Modification d'une structure
    Citation Envoyé par kyu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 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
          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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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).

  6. #6
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    Pour "Je me lance!", une petite critique avait été initié ici:
    http://www.developpez.net/forums/viewtopic.php?t=354728

  7. #7
    kyu
    kyu est déconnecté
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Merci de vos réponses, j'ai compris mon erreur

    Par contre je n'ai pas compris le rapport avec "Je me lance"
    Mon erreur venait d'une faute de raisonnement, j'utilisais struct comme un type de valeur (comme int, float ...) alors que struct sert a déclarer un "nouveau type" de valeur. Donc c'est le nom que je donne a ma structure qui devient un nouveau type de données comme int et compagnie ... enfin je crois.

  8. #8
    Membre émérite

    Homme Profil pro
    Inscrit en
    Juillet 2003
    Messages
    2 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations forums :
    Inscription : Juillet 2003
    Messages : 2 075
    Points : 2 844
    Points
    2 844
    Par défaut
    Citation Envoyé par kyu
    Merci de vos réponses, j'ai compris mon erreur

    Par contre je n'ai pas compris le rapport avec "Je me lance"
    Bien le rapport c'est qu'il te conseillait des bouquins qui téviterait de devoir désapprendre tout ce que tu as appris pour pouvoir concevoir du code C++ qui a de la tronche.
    Accelerated C++ est très bon pour ça
    PS:le bouton résolu est en bas du sujet pas la peine déditer le message

  9. #9
    kyu
    kyu est déconnecté
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    D'accord

    Je me suis acheté les deux livres de Delannoy parce que le livre contenant le cours etait edité en collection "Best Of" (donc il coute que 20euros), une fois que je l'ai acheté, je me suis rendu compte que j'avais pas d'idée d'exercice et apprendre un langage sans exercer est inconcevable pour moi (et je pense pour d'autres aussi ). Donc j'ai pris le bouquin d'exo du même auteur qui devait suivre le bouquin de cours ... mais c'est pas vraiment le cas, en tout cas je trouve pas l'ensemble trés bien réalisé ... (pas de réelle correlation entre les deux bouquins, peu d'explication dans la résolution des exercices ...).

  10. #10
    Membre émérite

    Homme Profil pro
    Inscrit en
    Juillet 2003
    Messages
    2 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations forums :
    Inscription : Juillet 2003
    Messages : 2 075
    Points : 2 844
    Points
    2 844
    Par défaut
    Citation Envoyé par kyu
    D'accord

    Je me suis acheté les deux livres de Delannoy parce que le livre contenant le cours etait edité en collection "Best Of" (donc il coute que 20euros), une fois que je l'ai acheté, je me suis rendu compte que j'avais pas d'idée d'exercice et apprendre un langage sans exercer est inconcevable pour moi (et je pense pour d'autres aussi ). Donc j'ai pris le bouquin d'exo du même auteur qui devait suivre le bouquin de cours ... mais c'est pas vraiment le cas, en tout cas je trouve pas l'ensemble trés bien réalisé ... (pas de réelle correlation entre les deux bouquins, peu d'explication dans la résolution des exercices ...).
    Eh bien t'as pas fait une bonne affaire: t'as acheté deux bouquins pour 40E dont la qualité est discutable.
    Moi je me suis fait envoyé de suède un exemplaire destocké de Accelerated C++ (avec exos inside) pour 30E frais de port compris (en fait y'en avait pas ). Bon c'est en anglais mais pour le monde C/C++ c'est un prérequis l'anglais...

  11. #11
    kyu
    kyu est déconnecté
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Etant donné que je suis pas trés avancé dans les livres, je peux essayer de les revendre, histoire de limiter la casse, je preferes reinvestir dans un bon bouquin que de galerer avec deux

    Pourrais tu me donner un lien ou commander ce livre ?

  12. #12
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    Chez amazon par exemple:
    http://www.amazon.fr/exec/obidos/ASIN/2742936521/wwwdeveloppec-21/

  13. #13
    kyu
    kyu est déconnecté
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    D'aprés la critique, "je me lance" se traine trop en longueur, et ne traites pas des sujets comme le polymorphisme. Je parlais pour acheter l'autre

    (mon erreur de tout a l'heure vient surtout du fait que ça fait plus de 2ans que j'ai pas tapé une ligne de C)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 07/03/2008, 16h40
  2. Réponses: 6
    Dernier message: 12/09/2007, 15h58
  3. Réponses: 7
    Dernier message: 13/03/2007, 11h20
  4. Réponses: 5
    Dernier message: 04/07/2006, 18h19
  5. [XSL-FO] Modifer une structure de tableau dans for-each
    Par serwol dans le forum XSL/XSLT/XPATH
    Réponses: 24
    Dernier message: 17/06/2005, 17h38

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