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 :

problème variable d'un bloc a un autre


Sujet :

C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 7
    Points : 4
    Points
    4
    Par défaut problème variable d'un bloc a un autre
    Bonsoir,

    Apprenant dans le cadre scolaire le C++, je dois résoudre des exos assez basique afin de se familiariser avec le langage (c'est pour cela qu'il n y a pas de classe dans le code qui suit).

    L'excercice consiste à créer un tableau "dynamique" de structure et à l'incrémenter à l'aide de new et delete [].

    Dans ce contexte ci, il faut gérer un tableau de structure de pièce.

    l'utilisateur ajoute des pièces jusqu'à cliquer sur 2 dans le choix préliminaire (continuer ou non).

    J'ai déja réaliser l'excercice avec passage par une fonction mais j'ai essayé de le refaire par une manière "séquentielle et procédurale"...mais ca foire un peu

    Pour info,je travaille sous code::blocks

    Voici donc le 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
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    #include<iostream>
    
    using std::cout;
    using std::cin;
    using std::endl;
    
    struct piece{
    
        char nom[30];
        char code[12];
        char description[120];
        int stock;
    };
    
    int main(int argc, char * argv[])
    {
    
        piece *unePiece =new piece[1], *tpiece=NULL;
        int reponse=1,num_piece=0;
        bool continuer=true;
        while(continuer)
        {
    
            cout << "Voulez-vous inseser une piece? [1 --> oui] [2 --> non]:";
    
            cin >> reponse;
            if(reponse==2)
            {
    
                delete[] unePiece;
                continuer=false;
    
            }
            else
            {
                num_piece++; //on ajoute une piece
                tpiece=new piece[num_piece]; //on crée un tableau temporaire avec le nombre de pièce incrémenté
    
                for(int i=0;i<num_piece-1 ;i++) //Si il y a une seule piece, ne rentre pas
                {
                    tpiece[i]=unePiece[i]; // copie les deux tableaux
                }
                delete [] unePiece;
    
                cout << "Nom de la piece : "<<endl;
                cin >> tpiece[num_piece-1].nom; // rajoute le nom dans le dernier maillon du tableau
                cout<<tpiece[0].nom;
                cout<<endl<<num_piece-1<<endl;// rajoute le nom dans le dernier maillon du tableau
                 // efface le tableau obsolete
                unePiece=tpiece; // repasse la main au tableau principal
                cout<<endl<<"unePiece[0]"<<unePiece[0].nom<<endl;
    
            }
    
    
        }
    /*le passage du while au reste de la fonction main provoque la "perte" du premier maillon du tableau de structure piece*/
    
        cout<<endl;
        cout<<"Piece [0] : "<<unePiece[0].nom<<endl;
        for(int i=0;i<num_piece;i++)
        {
            cout<<"------------------------------"<<endl;
            cout<<"Piece num "<< i+1 << " :"<<endl;
            cout<<"Nom : "<< unePiece[i].nom<<endl;
        }
        delete []unePiece;
    return 0;
    }
    Le problème est signalé dans les balise commentaire /* -->*/
    Si je n'ai pas été assez clair, je répondrai à toute vos questions

    D'avance Merci :p

  2. #2
    Membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2006
    Messages : 37
    Points : 64
    Points
    64
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    piece *unePiece =new piece[1], *tpiece=NULL;
    int reponse=1,num_piece=0;
    Il faut éviter de déclarer plusieurs variables à la fois ; surtout quand elles sont sans rapport.

    Tu crées un tableau de taille 1 et tu indiques une taille de zéro ; tu te prépares des problèmes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    delete[] unePiece;
    continuer=false;
    Tu « delete » une Piece mais tu va l'utilser après !

    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
     
    num_piece++; //on ajoute une piece
    tpiece=new piece[num_piece]; //on crée un tableau temporaire avec le nombre de pièce incrémenté
     
     for(int i=0;i<num_piece-1 ;i++) //Si il y a une seule piece, ne rentre pas
     {
          tpiece[i]=unePiece[i]; // copie les deux tableaux
     }
     delete [] unePiece;
     
    cout << "Nom de la piece : "<<endl;
    cin >> tpiece[num_piece-1].nom; // rajoute le nom dans le dernier maillon du tableau
    cout<<tpiece[0].nom;
    cout<<endl<<num_piece-1<<endl;// rajoute le nom dans le dernier maillon du tableau
    // efface le tableau obsolete
    unePiece=tpiece; // repasse la main au tableau principal
    cout<<endl<<"unePiece[0]"<<unePiece[0].nom<<endl;
    Il faut essayer de travailler de manière transactionelle :
    1. créer tpiece et l'initialiser
    2. mettre à jour unePiece et num_piece

    Exécute ta boucle for à la main, tu m'en diras des nouvelles. Ai-je remarqué que num_piece est initialisé à 0 ?

    Que vienne faire les tpiece[0] et unePiece[0] ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    delete []unePiece;
    Encore !


    Choisis une convention et suis là : tpiece, unePiece et num_piece


    Une version « corrigée » :

    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
    53
    54
    55
    56
    57
    58
     
     
    int
    main() {
     
      piece * unePiece(0);
      int numPiece(0);
     
      bool continuer=true;
      while(continuer) {
     
        int reponse(0);
        cout << "Voulez-vous inserer une piece? [1 --> oui] [autre --> non]:";
        cin >> reponse;
        if(reponse == 1) {
     
          // Copie de unePiece.
          piece * tPiece(new piece[numPiece+1]);
          for(int i(0); i != numPiece; ++i) {
     
            tPiece[i]= unePiece[i];
          }
     
          // Mise à jour de tPiece.
          cout << "Nom de la piece : " << endl;
          cin >> tPiece[numPiece].nom;
     
          // Code, description, ...
     
          // Switch unePiece et tPiece.
          delete [] unePiece;
          unePiece= tPiece;
          ++numPiece;
     
        } else {
     
          continuer=false;
        }
      }
     
      cout << "------------------------------" << endl;
      if(unePiece != 0) {
     
        for(int i(0); i != numPiece; ++i) {
     
          cout << "Piece num "<< i << " :" << endl;
          cout << "\tNom : "<< unePiece[i].nom << endl;
        }
     
      } else {
     
        cout << "Pas de piece" << endl;
      }
     
      delete []unePiece;
     
      return 0;
    }

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Un grand Merci . Aucune excuse pour ce genre de démarche

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Petite note à part : ton code n'est pas exception-safe.
    Mais bon on s'en fout probablement de toutes façons, vu que tout le code est dans main.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    En fait c'était plus un bidouillage qu'autre chose
    Je m'étais pas penché sur la sortie du while...

  6. #6
    Membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2006
    Messages : 37
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par michael urbain
    je dois résoudre des exos assez basique
    Citation Envoyé par loufoque
    Petite note à part : ton code n'est pas exception-safe.
    Est-ce que l'execption-safety est un critère basique ?

    Note : j'ai indiqué -- sans justification -- à Michael de penser transactionnel, je te laisse ajouter le try/catch

Discussions similaires

  1. probléme concernant le passage des variable d'une page web à une autre
    Par aefmaaradji dans le forum Développement Web avec .NET
    Réponses: 1
    Dernier message: 13/08/2010, 19h27
  2. Réponses: 4
    Dernier message: 29/06/2010, 11h45
  3. Réponses: 8
    Dernier message: 28/10/2009, 19h08
  4. Problème d'affichage d'un navigateur à l'autre !
    Par [Morgan] dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 10/12/2004, 11h21
  5. problème variable extern
    Par HeKaz dans le forum C
    Réponses: 14
    Dernier message: 08/01/2003, 01h44

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