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] trouver les erreurs dans un code


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 180
    Points : 65
    Points
    65
    Par défaut [Débutant] trouver les erreurs dans un code
    Bonjour,

    J'ai un code en C++ dans lequel je dois trouver les erreurs, le voici :

    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
    typedef double T;
    class A{
    public:
    int n;
    T *v;
    A(int nn=0):n(nn),v(n>0 ? new T[n]:0) {}
    T& operator [] (int i) {
    assert(v && (i>=0) && (i<n) );
    return v[i];
    }
     
    ~A() { if (v) delete [] v; }
     
    }
     
    int main( int argv, const char *[])
    {
    A a(10), b(10);
    for (int i=0;i<10;i++)
    a[i]=i;
    b=a;
    A c(b);
    assert( c[4]==4);
    return 0;
    }
    La seule erreur que j'ai trouvée pour l'instant c'est le ';' qui manque après l'accolade de fin de classe.
    Dans le constructeur par exemple, je comprends pas ce que signifie cette ligne :
    Je vois bien que c'est pour construire un tableau de type T et qui a nn éléments, mais c'est quoi le '?' ?
    Pareil dans le main, j'ai jamais vu des const char *[] je me dis que l'erreur vient peut-etre de là sachant que j'ai toujours vu des main du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int main ( int argc, char *argv[])
    Merci de bien vouloir m'aiguiller

  2. #2
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Déjà un premier conseil: indente le code correctement, tu verras certainement des erreurs apparaitre
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  3. #3
    screetch
    Invité(e)
    Par défaut
    as tu essayé de compiler le code et de voir ce que disait le compilateur ?
    as tu essayé de lancer le programme ?

    la syntaxe test ? resutat1 : resultat2 est un operateur qui, selon le test, renvoie la premiere valeur ou bien la seconde. donc

    signifie qu'on initialise v avec le resultat de cela signifie que si n est superieur a 0 alors on initialisera v avec new T[n] ou sinon a 0.

    const char * ca ne change pas grand chose, cela signifie que tu ne peux pas modifier la ligne de commande. dans la mesure ou tu ne l'utilises pas, ca ne doit pas psoer trop de probleme.

    il y a un probleme bien plus important, c'est que la classe A ne definit pas de constructeur de copie mais que la fonction main appelle une copie. Le constructeur de copie (et l'operateur de recopie) sont donc definis par defaut, et le code compile mais est incorrect.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 180
    Points : 65
    Points
    65
    Par défaut
    Qu'est ce que ça veut dire idente ?

  5. #5
    screetch
    Invité(e)
    Par défaut
    la touche des scores dans counter strike

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 180
    Points : 65
    Points
    65
    Par défaut
    Merci Screetch.
    Effectivement j'avais remarqué le constructeur par copie n'est pas défini.
    J'ai en fait avec l'exercices les erreurs de compilation de données, mais j'essaye avant de trouver sans regarder.

  7. #7
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par rouliane Voir le message
    Qu'est ce que ça veut dire idente ?
    Oui pardon, faute de frappe: indente.

    Indenter le code c'est le mettre dans la bonne forme (avec les tabulations).
    Un exemple de code non indenté:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class Toto
    {
    public:
    Toto();
    private:
    int membre;
    };
    Un exemple de code indenté:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class Toto
    {
    public:
        Toto();
     
    private:
        int membre;
    };
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  8. #8
    screetch
    Invité(e)
    Par défaut
    ben en fait c'est la seule erreur de syntaxe, et le fait que assert ne soit pas defini (manque un #include)

    apres ca l'autre probleme est bien plus important

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 180
    Points : 65
    Points
    65
    Par défaut
    Merci pour la precision sur indente, j'ai "indenté" mon code

    Effectivement, j'ai rajouté cassert en include et mis le ; je n'ai plus d'erreur.
    Je vais essayer de régler le problème du constructeur par copie.

    Merci à vous en tout cas.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 180
    Points : 65
    Points
    65
    Par défaut
    Alors j'ai fait le constructeur par copie suivant, apparemment y'a pas d'erreur de syntaxe ni de compilation, mais je ne sais pas si c'est juste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	A(const A & source) {
    	n=source.n;
    	v= new T[n];	
    	for (int i=0; i<n; i++) v[i]=source.v[i];
    	}
    Qu'en pensez-vous ?

  11. #11
    Invité
    Invité(e)
    Par défaut
    Attention rouliane, il vaut mieux respecter la règle décrite dans le premier constructeur, et qui dit que si le tableau n'a pas d'élément, il n'a pas non plus de tableau v ("new T[0]" ne renverra pas un pointeur nul). Dans ta version, la copie aura une différence avec l'original, ce qui n'est pas nécessaire et peut amener pas mal de petites confusions.

    Et aussi petit "truc": delete[] 0; ne fait rien, tu peux dont te passer du if dans ton destructeur.

    Cheers,

    Carl

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 180
    Points : 65
    Points
    65
    Par défaut
    Merci !

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/03/2009, 17h37
  2. Réponses: 3
    Dernier message: 21/05/2008, 16h37
  3. [Débutant] Recherche d'erreur dans un code
    Par feynman dans le forum Fortran
    Réponses: 7
    Dernier message: 17/07/2007, 20h48
  4. [Visual Web] trouver l'erreur dans le code "sen email"
    Par diamonds dans le forum NetBeans
    Réponses: 4
    Dernier message: 21/11/2006, 20h05
  5. Trouver les redondances dans un code
    Par progfou dans le forum C
    Réponses: 9
    Dernier message: 17/03/2006, 08h53

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