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 :

Le programme a cessé de fonctionner


Sujet :

C++

  1. #1
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 183
    Points : 78
    Points
    78
    Par défaut Le programme a cessé de fonctionner
    Bonjour,

    A la fin de l'exécution , et après l'affichage des tableaux,le programme cesse de fonctionner pourquoi?
    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
    #include <iostream>
    #include <iomanip>
    using namespace std;
     
    class tableau
    {    int *tab;
         int Nmax;
         public:
        tableau(int N);
        ~tableau();
        void remplir_t(int nb);
        void lecture();
        void affichage();
     
    };
    tableau::tableau(int N)
    {
        Nmax=N;
    }
    tableau::~tableau()
    {
        cout<<"ceci est un destructeur"<<endl;
    }
    void tableau::remplir_t(int nb)
    {
        for(int i=0;i<Nmax;i++)
        tab[i]=nb;
        cout<<"    ";
    }
    void tableau::lecture()
    {
        for(int i=0;i<Nmax;i++)
        cin>>tab[i];
     
    }
    void tableau::affichage()
    {
        for(int i=0;i<Nmax;i++)
        cout<<setw(4)<<tab[i];
    }
    int main()
    {
        tableau t(4);
        t.remplir_t(5);
        t.affichage();
        t.lecture();
        t.affichage();
    }
    Merci d'avance.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 372
    Points : 23 628
    Points
    23 628
    Par défaut
    Bonjour,

    J'ai rajouté les formules de politesse d'usage à ton message parce que le ton que tu emploies est beaucoup trop impératif.

    Pour le reste :

    1. Tu déclares un pointeur « tab » mais tu ne l'initialise pas. Il pointe donc n'importe où par défaut ;
    2. D'une manière générale, tu n'alloues pas de mémoire pour ton tableau. Si tu écris dedans (n'importe où, donc), tu vas droit à la segfault… dans le meilleur des cas !
    3. Tu as oublié de faire un return à la fin de main(). Le code de retour est donc indéfini et le système d'exploitation peut prendre cela pour un rapport d'erreur.

  3. #3
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 183
    Points : 78
    Points
    78
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Bonjour,

    J'ai rajouté les formules de politesse d'usage à ton message parce que le ton que tu emploies est beaucoup trop impératif.

    Pour le reste :

    1. Tu déclares un pointeur « tab » mais tu ne l'initialise pas. Il pointe donc n'importe où par défaut ;
    2. D'une manière générale, tu n'alloues pas de mémoire pour ton tableau. Si tu écris dedans (n'importe où, donc), tu vas droit à la segfault… dans le meilleur des cas !
    3. Tu as oublié de faire un return à la fin de main(). Le code de retour est donc indéfini et le système d'exploitation peut prendre cela pour un rapport d'erreur.
    Bonjour,
    Je pense que c'est le rôle du constructeur d'initialiser le tableau; sinon je vois pas comment corriger ces fautes ?
    Merci

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 372
    Points : 23 628
    Points
    23 628
    Par défaut
    Ceci est un tableau : char tab[10];
    Ceci est un pointeur : char *tab;

    Dans le premier cas, tu réserves l'espace occupé par 10 caractères exactement en mémoire. Tu ne déclares pas de pointeur associé mais le compilateur sait où se trouve ton tableau. Invoquer son nom te permet donc d'en obtenir l'adresse et donc de l'indexer pour pouvoir, à terme, déposer des choses dedans. Par défaut, le contenu de ce tableau est indéfini et donc complètement aléatoire. Mais ce n'est pas un problème car tu vas immédiatement écrire dedans ;

    Dans le second cas, tu déclares un pointeur, c'est-à-dire une variable à même de contenir une adresse mémoire, et dans ce cas précis, l'adresse en mémoire d'un caractère. Par défaut, cette variable est elle-aussi indéfinie, et ne pointe sur rien du tout. Elle sera à même de pointer un tableau de caractères dès lors que tu l'auras réservé, mais elle ne va en aucun cas l'allouer pour toi.

    Citation Envoyé par nourhene4 Voir le message
    Bonjour,
    Je pense que c'est le rôle du constructeur d'initialiser le tableau; sinon je vois pas comment corriger ces fautes ?
    Merci
    Oui et justement : tu as regardé ton constructeur ?

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    tableau::tableau(int N)
    {
        Nmax=N;
    }

    Tu enregistres dans Nmax la taille demandée du tableau, mais où est-ce que tu alloues la mémoire nécessaire dans les faits ?

  5. #5
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 183
    Points : 78
    Points
    78
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Ceci est un tableau : char tab[10];
    Ceci est un pointeur : char *tab;

    Dans le premier cas, tu réserves l'espace occupé par 10 caractères exactement en mémoire. Tu ne déclares pas de pointeur associé mais le compilateur sait où se trouve ton tableau. Invoquer son nom te permet donc d'en obtenir l'adresse et donc de l'indexer pour pouvoir, à terme, déposer des choses dedans. Par défaut, le contenu de ce tableau est indéfini et donc complètement aléatoire. Mais ce n'est pas un problème car tu vas immédiatement écrire dedans ;

    Dans le second cas, tu déclares un pointeur, c'est-à-dire une variable à même de contenir une adresse mémoire, et dans ce cas précis, l'adresse en mémoire d'un caractère. Par défaut, cette variable est elle-aussi indéfinie, et ne pointe sur rien du tout. Elle sera à même de pointer un tableau de caractères dès lors que tu l'auras réservé, mais elle ne va en aucun cas l'allouer pour toi.



    Oui et justement : tu as regardé ton constructeur ?

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    tableau::tableau(int N)
    {
        Nmax=N;
    }

    Tu enregistres dans Nmax la taille demandée du tableau, mais où est-ce que tu alloues la mémoire nécessaire dans les faits ?
    Dire que c'est le code de mon professeur !!
    Sinon donc est ce que dois juste initialiser les cases du tableaux par un nombre ?
    Merci

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par nourhene4 Voir le message
    Dire que c'est le code de mon professeur !!
    Sinon donc est ce que dois juste initialiser les cases du tableaux par un nombre ?
    Merci
    Tu parcours ton tableau et tu mets le nombre que tu souhaites dans chaque case.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 183
    Points : 78
    Points
    78
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Tu parcours ton tableau et tu mets le nombre que tu souhaites dans chaque case.
    C'est fait mais je trouve le même problème ; à la fin le programme cesse de fonctionner

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    As-tu ajouté l'initialisation du tableau en question depuis le 2° post ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  9. #9
    Membre éprouvé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2009
    Messages : 552
    Points : 1 060
    Points
    1 060
    Par défaut
    Citation Envoyé par nourhene4 Voir le message
    Ce que je comprends pas c'est en quoi vous dérange que j'écrive une variable avec un nom particulier !
    Quand une variable a un nom parlant, on ne remonte pas à sa déclaration et à un éventuel commentaire pour savoir ce que c'est. Tu demandais qu'on t'aide avec un problème, ils t'expliquent qu'ils se perdent dans tes variables.

    Pour le reste, c'est un forum d'aide, pas un service de conseil où tu auras des conseils mielleux qui ne pas blesse pas ton orgueil.

    Quand quelque chose ne va pas, on te le dit franchement, sans tourner autour du pot et c'est ça qui te permettra de progresser si tu ne prends pas les critiques sur ton code pour des jugements de valeur sur ta personne.

    Bye

  10. #10
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par nourhene4 Voir le message
    Je pense que c'est le rôle du constructeur d'initialiser le tableau...
    Salut à toi.
    Ce n'est pas exactement ça. Le constructeur est automatiquement appelé chaque fois que tu créeras une variable de type "tableau". Typiquement dans les cas suivants
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    tableau toto;    // ici
    tableau *pt;
    pt=new tableau;    // ici

    Toutefois c'est explicitement à toi de créer un constructeur qui fasse un boulot correct. Donc si ton objet contient lui-même un pointeur qui doit être plus tard rempli de datas, alors c'est à toi d'écrire l'allocation qui va bien pour que le pointeur ait la mémoire suffisante pour stocker les datas. Et un des meilleurs endroits pour faire cette allocation reste quand-même de la faire dans le constructeur puisqu'il est automatiquement appelé.

    Pour le reste, les critiques qu'on te fait sont là pour t'aider à t'améliorer. Après tout, tu demandes ce qui ne va pas, ben on te dit ce qui ne va pas. D'ailleurs une chose qui ne va pas et qui n'a pas été dite c'est que ton code sera beaucoup plus clair pour tout le monde (y compris pour toi) si tu nommes tes types "t_qqchose" et non "qqchose". Ca te permettra de garder le vocable "tableau" pour pouvoir l'utiliser sur un nom de variable.

    Citation Envoyé par nourhene4 Voir le message
    Ce que je comprends pas c'est en quoi vous dérange que j'écrive une variable avec un nom particulier !
    Bah c'est un peu évident. Ca aide à la relecture facile du code. N'oublie pas que si tu te destines à travailler dans la dev tu ne seras pas tout seul. Tu bosseras avec d'autres développeurs qui devront utiliser ton code (ou y travailler). Et plus tes variables auront un nom clair et représentatif de leur utilité plus le travail sera serein. Si tu dois stocker un age ce sera plus sympa pour tout le monde (y compris pour toi si tu dois revenir sur un code 6 mois après) si ta variable se nomme "age" plutôt que si elle se nomme "no_tel"...

    Citation Envoyé par nourhene4 Voir le message
    Dire que c'est le code de mon professeur !!
    Personne n'est à l'abri de faire des erreurs...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  11. #11
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 183
    Points : 78
    Points
    78
    Par défaut
    Citation Envoyé par bretus Voir le message
    Quand une variable a un nom parlant, on ne remonte pas à sa déclaration et à un éventuel commentaire pour savoir ce que c'est. Tu demandais qu'on t'aide avec un problème, ils t'expliquent qu'ils se perdent dans tes variables.

    Pour le reste, c'est un forum d'aide, pas un service de conseil où tu auras des conseils mielleux qui ne pas blesse pas ton orgueil.

    Quand quelque chose ne va pas, on te le dit franchement, sans tourner autour du pot et c'est ça qui te permettra de progresser si tu ne prends pas les critiques sur ton code pour des jugements de valeur sur ta personne.

    Bye
    Bonjour,
    Le problème c'est que c'est le code de mon professeur je l'ai copier ici, c'est pas moi qui a nommer les variables , sinon j'apprécie les efforts de chacun

  12. #12
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 372
    Points : 23 628
    Points
    23 628
    Par défaut
    Citation Envoyé par nourhene4 Voir le message
    Bonjour,
    Le problème c'est que c'est le code de mon professeur je l'ai copier ici, c'est pas moi qui a nommer les variables
    Justement, il a peut-être volontairement glissé une petite erreur pour voir ceux qui suivent :-) Code du prof' ou pas, ça devrait te sauter aux yeux immédiatement.

    sinon j'apprécie les efforts de chacun
    Je ne sais pas si tu l'as remarqué, mais on t'a donné la solution dans nos posts précédents. Donc :

    — Soit tu déclares directement un tableau avec « tab[10] », ce qui n'est pas faisable ici car la taille de ton tableau est spécifiée à la construction de l'instance de ta classe ;
    — Soit tu utilises un pointeur chargé de pointer une zone allouée en mémoire de la bonne taille et, dans ce cas, ben il faut allouer cette zone.

    Est-ce que ceci te paraît normal ou pas ? C'est important parce que si tu ne vois toujours pas pourquoi, tu ne peux pas aller plus loin pour le moment. Donc, il faut que l'on tire cela au clair d'abord.

  13. #13
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 183
    Points : 78
    Points
    78
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    — Soit tu utilises un pointeur chargé de pointer une zone allouée en mémoire de la bonne taille et, dans ce cas, ben il faut allouer cette zone.
    Donc si j'ai bien compris je dois utiliser un pointeur , donc la méthode dynamique ? avec new et delete c'est ca ?

  14. #14
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 372
    Points : 23 628
    Points
    23 628
    Par défaut
    Citation Envoyé par nourhene4 Voir le message
    Donc si j'ai bien compris je dois utiliser un pointeur , donc la méthode dynamique ? avec new et delete c'est ca ?
    C'est bien cela.
    À ceci près que tu alloues un tableau, donc « new[] » et « delete[] » plutôt que « new » et « delete » seuls.

    Ça signifie également qu'il faudra placer ton « delete[] » dans le destructeur.

Discussions similaires

  1. SDL programme a cessé de fonctionner
    Par czar1983 dans le forum SDL
    Réponses: 12
    Dernier message: 20/07/2013, 16h52
  2. Mon programme Qt cesse de fonctionner
    Par Pouknouki dans le forum Débuter
    Réponses: 2
    Dernier message: 19/07/2013, 12h13
  3. Programme a cessé de fonctionner
    Par Divelopiz dans le forum VB.NET
    Réponses: 3
    Dernier message: 29/07/2012, 12h05
  4. le programme a cessé de fonctionner
    Par ghost_23 dans le forum Windows Vista
    Réponses: 1
    Dernier message: 13/10/2009, 22h40
  5. Pb deploiement : "Le programme a cessé de fonctionner"
    Par vikz dans le forum Général Dotnet
    Réponses: 13
    Dernier message: 12/03/2008, 15h39

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