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 :

probleme exercice C++


Sujet :

C++

  1. #1
    Membre confirmé Avatar de ludo86
    Homme Profil pro
    Développement applications iOS/android
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développement applications iOS/android
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Par défaut probleme exercice C++
    Salut à tous,
    Je suis tombé sur un exo , qui va vous paraitre simple, mais que je n'arrive pas a résoudre pourriez vous m'aidez.

    Expliquez pourquoi le code suivant génère une erreur de compilation.
    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
    class String {
    private :
       char *chaine ;
       int longueur ;
     
    public :
      String() { chaine = NULL ; longueur = 0 ; }
      String(const char *st) {chaine = new char [strlen(st)+1 ];longueur = strlen(st) ; strcpy (chaine, st) ; }
      ~String() { if (chaine) delete chaine ; }
    };
     
    int main(int argc, char **argv)
    {
       String s("abc") ;
       cout << s ;
       return(0);
    }
    Alors tout d'abord premier pb, pour moi strlen() et strcpy() ne peuvent s'appliquer que sur des chaines de caractères et pas directement sur leur pointeur!
    Deuxième problème, pour moi donc le pb vient de là et également du cout dans le main, n'aurait il pas fallu rajouter un friend ostream& operator<<(ostream&, const String&).Est ce que je me trompe?

    Ensuite,toujours à partir de la classe String, indiquez si le code suivant génère des erreurs de compilation ou sinon que se passe-t-il après l’opération s1=s3 (pour s1) si l'opérateur d'affectation = n'a pas été écrit par l'utilisateur ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int main(int argc, char **argv)
    {
     String s1("abc") ;
     String* s2 = new String(“cde”) ;
     String& s3 = *s2 ;
     s1 = s3 ;
     delete s2 ; 
     return (0) ;
    }
    Alors pour moi l'opérateur= n'ayant pas été écrit il va donc procédé à une copie bit à bit mais les pointeur vont peut être poser problème.
    Je sais ce que vous allé dire, la solution est de tester mais si le programme comporte une erreur de compile et que je la vois je m'acharne pour rien(en plus j'ai deja essayé de compiler et ça marche pas )
    Merci d'avance.

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Alors tout d'abord premier pb, pour moi strlen() et strcpy() ne peuvent s'appliquer que sur des chaines de caractères et pas directement sur leur pointeur!
    Je ne comprends pas ce que tu veux dire. Tu manipules des chaînes de type C, donc des pointeurs sur caractères ; il n'y a pas de différence.

    Deuxième problème, pour moi donc le pb vient de là et également du cout dans le main, n'aurait il pas fallu rajouter un friend ostream& operator<<(ostream&, const String&).Est ce que je me trompe?
    Non c'est bien ça, il faut définir la surcharge de << entre un ostream et ta classe String pour que ça fonctionne.

    Alors pour moi l'opérateur= n'ayant pas été écrit il va donc procédé à une copie bit à bit mais les pointeur vont peut être poser problème
    Exact, lors de copies / affectations il faut dupliquer la chaîne et pas seulement le pointeur.

    Au final je ne vois pas ce qui te bloque, tu as l'air de bien avoir compris les problèmes qui se posent ici. Si tu n'arrives pas à écrire l'opérateur <<, tu peux jeter un oeil à la FAQ C++.

  3. #3
    Membre confirmé Avatar de ludo86
    Homme Profil pro
    Développement applications iOS/android
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développement applications iOS/android
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Par défaut
    Alors en fait, je me suis surement mal expliqué.
    Pour moi quand il effectue le strlen() et le strcpy() il le fait sur les adresses des pointeurs et non sur l'objet pointé par le pointeur ici la chaine de caratère.
    Or je pensais que ces 2 fonctions n'admettais que des chaines de caractères au quel cas il y aurais une erreur.
    Cependant, tu semble dire qu'il n'y a pas de pb si on place simplement les adresses des pointeurs, ce qui pour ma par me chagrinais...

    En ce qui concerne le friend ostream& je pense pouvoir me débrouiller.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 125
    Par défaut
    autre erreur le delete , il faut un delete[] mais ca ne genere pas d erreurs de compiles

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Pour moi quand il effectue le strlen() et le strcpy() il le fait sur les adresses des pointeurs et non sur l'objet pointé par le pointeur ici la chaine de caratère
    Il n'y a pas ici d'adresse de pointeur (ce serait un pointeur sur un pointeur). Il n'y a pas non plus d'"objet" correspondant à la chaîne de caractères.
    Il n'y a que des pointeurs vers des tableaux de caractères, qui s'ils sont terminés par un '\0' (ce qui est le cas) sont considérés comme des chaînes de caractères. Où vois-tu une adresse de pointeur ?

    autre erreur le delete , il faut un delete[] mais ca ne genere pas d erreurs de compiles
    De plus il n'est pas nécessaire de tester la validité du pointeur, delete [] NULL est tout à fait valide.

  6. #6
    Membre confirmé Avatar de ludo86
    Homme Profil pro
    Développement applications iOS/android
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développement applications iOS/android
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Par défaut
    Alors je dis surement une bétise mais pour moi, quand on écrit char*toto;

    toto est l'adresse de l'élément char qui menera à celui ci et *toto est l'élément char en question.
    Est ce que je me trompe?

    Dans cette hypothèse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String(const char *st) {chaine = new char [strlen(st)+1 ];longueur = strlen(st) ; strcpy (chaine, st) ; }
    strlen(st) est une fonction qui prend en paramètre l'adresse de l'élément char et pas l'élément char en lui même ne serait il pas judicieux d'écrire plutôt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String(const char *st) {chaine = new char [strlen(*st)+1 ];longueur = strlen(*st) ; strcpy (*chaine, *st) ; }

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Non car *st représente la valeur d'un seul caractère (le premier), là on perd l'adresse de la chaîne et donc son contenu. Comment retrouver la suite de la chaîne si on ne donne que son premier caractère et non son adresse ?

  8. #8
    Membre confirmé Avatar de ludo86
    Homme Profil pro
    Développement applications iOS/android
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développement applications iOS/android
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Par défaut
    Je pensais que la fonction strlen() et strcpy() ne pouvait pas prendre comme paramètre une adresse, donc c'était une erreur de ma part!

    En effet, je me basé sur ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    string a;
    string b;
    string c;
     
    c=strcpy(a,b);
    int longueur=strlen(a);
    Mais apparemment on peut aussi passé dynamiquement...

  9. #9
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    string a;
    string b;
    string c;
     
    c=strcpy(a,b);
    int longueur=strlen(a);
    Ca c'est n'importe quoi (ça ne compilera pas avec std::string, et avec certaines classes de chaîne ça compilera mais ça crashera)
    Si c'est std::string, on écrit plutôt ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    string a;
    string b;
    string c;
     
    c = a + b
    size_t longueur = a.length();
    Il faudrait que tu trouves un bon cours sur les chaînes C et les chaînes C++ (genre sur developpez.com), tu as l'air de confondre ces deux notions.

  10. #10
    Membre confirmé Avatar de ludo86
    Homme Profil pro
    Développement applications iOS/android
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développement applications iOS/android
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Par défaut
    Ok ne t'énerve pas!

    Merci pour ta patience ça semble plus clair.

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

Discussions similaires

  1. Probleme exercice de Gerard Swinnen 8.13
    Par elnabo dans le forum Tkinter
    Réponses: 5
    Dernier message: 23/03/2011, 10h44
  2. Probleme exercice à resoudre
    Par nabilfaouzi dans le forum C
    Réponses: 15
    Dernier message: 24/11/2007, 09h47
  3. probleme exercice en ocaml
    Par alix30002000 dans le forum Caml
    Réponses: 8
    Dernier message: 11/10/2007, 16h08
  4. Probleme exercice list
    Par Gebudi. dans le forum C++
    Réponses: 6
    Dernier message: 31/07/2006, 15h43
  5. problemes exercices sql
    Par siciliano_messinese dans le forum Langage SQL
    Réponses: 3
    Dernier message: 23/09/2005, 16h52

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