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 :

une fonction d'affichage à rajouter


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 80
    Points : 51
    Points
    51
    Par défaut une fonction d'affichage à rajouter
    bonjour

    j'ia un code qui compile sous visual c++6.0 mais ne compile pas sur devc++.
    je voudrai éviter ces erreurs sur devc++, pourriez vous m'aider?
    (les ptis warning ou erreurs peuvent qq fois montrer qu'un code est peu rigoureux ou qu'il y a un risque qq part donc je voudrai juste éviter les messages d'erreurs).
    merci

    voilà mon 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
     
    #include <string.h> // strcpy(); strlen();
    #include <conio.h> // getch();
    #include <iostream> // cout et cin
    using namespace std;
     
    class String
    {
    // private :
        int nbr;
        char *ptr;
    public:
        String (char[]);
        String (char);
        ~String();
        String& operator=(const String &);
        String(const String &);
        String plus (const String &); 
    };     
     
    String String::plus(const String &s)
    {
        char *chaine = new char[nbr+s.nbr-1];
        for(int i=0;i<nbr-1;i++)     // strcpy(chaine,ptr);               l66
            chaine[i]=ptr[i];        
        for(i=nbr-1;i<nbr+s.nbr-1;i++)    // strcat(chaine,s.ptr);       l68
            chaine[i]=s.ptr[i-nbr+1];       
        String resultat(chaine);
        delete chaine;
        return (resultat); 
    }
     
    void main ()
    {
        String s1("azerty"),s2('q');
     
        String s3=s1.plus(s2);
     
        s3=s1.plus('w');
        getch(); 
    }
    les erreurs sont les suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    In member function `String String::plus(const String&)':
     
    68: error: name lookup of `i' changed for new ISO `for' scoping
     
    66: error:   using obsolete binding at `i'
    66: error:   At global scope:
    MERCI d'avance.

    ps : remplacer par strcpy et ctrcat règle le problème mais comment avec seulement 2 fort j'obtiens 4 erreurs

  2. #2
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    salut,

    c'est normal que ça plante. c'est dev c++ qui a raison. visual l'accepte, mais il ne devrait pas (par rapport au standard).

    ta variable i est déclarée localement, sa portée est limitée à la 1ere boucle for. elle n'existe plus lors de l'appel dans la 2è boucle, d'où le caractère "obsolète" de la variable.

    solution : soit redéclarer "i" dans la 2è boucle, soit en faire une variable dont la portée couvre toute la fonction

    // solution 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    String String::plus(const String &s)
    {
        char *chaine = new char[nbr+s.nbr-1];
        for(int i=0;i<nbr-1;i++)                 chaine[i]=ptr[i];       
        for(int i=nbr-1;i<nbr+s.nbr-1;i++)   chaine[i]=s.ptr[i-nbr+1];       
        String resultat(chaine);
        delete chaine;
        return (resultat);
    }
    // solution 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    String String::plus(const String &s)
    {
        int i;
        char *chaine = new char[nbr+s.nbr-1];
        for(i=0;i<nbr-1;i++)                 chaine[i]=ptr[i];       
        for(i=nbr-1;i<nbr+s.nbr-1;i++)   chaine[i]=s.ptr[i-nbr+1];       
        String resultat(chaine);
        delete chaine;
        return (resultat);
    }

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 80
    Points : 51
    Points
    51
    Par défaut
    Merci bigboomshakala ! 8)

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 80
    Points : 51
    Points
    51
    Par défaut
    j'ai à présent un programme avec

    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
    #include <string.h> // strcpy(); strlen();
    #include <conio.h> // getch();
    #include <iostream> // cout et cin
    using namespace std;
     
    class String
    {
    // private :
        int nbr;
        char *ptr;
    public:
        String (char[]);
        String (char);
        ~String();
        String& operator=(const String &);
        String(const String &);
        String plus (const String &); 
        getString (const String &);
    };                                  
     
    String String::plus(const String &s)
    {
        int i; 
     
        char *chaine = new char[nbr+s.nbr-1]; // alloue un tableau de caractères   
        for(i=0;i<nbr-1;i++)         // strcpy(chaine,ptr);
            chaine[i]=ptr[i];        
        for(i=nbr-1;i<nbr+s.nbr-1;i++)    // strcat(chaine,s.ptr);
            chaine[i]=s.ptr[i-nbr+1];     caractères     
        String resultat(chaine);
        delete[] chaine; 
        return (resultat); 
    }
    et le main avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    String s1("azerty"),s2('q');
    String s3=s1.plus(s2);
    cout<<"s3 = "<<s3.getString()<<endl;
    => comment faire afficher s3.getString?

    j'ai rajouté " getString (const String &); " tout en haut dans les déclaration

    et j'essaie la fonction

    String::getString (const String &s);
    {
    int i
    for(i=0;i<s.nbr;i++)
    printf("%c", // là je bloque
    }

    j'essaie d'afficher les lettre de la chaine mais j'ai qu'un pointeur dans mon objet String.
    j'ai pas de nom de type tableau[i] à afficher. je veux afficher les cases du tabeau (inconnu?) désigné par le pointeur ptr,
    je pensais à un (s.(*ptr))[i] ça existe? c'est (le contenu du pointeur)de l'objet s. donc le contenu du pointeur est une case et je met [i] pour avoir la 1ère case.
    ensuite je pourrait remplacer le printf par cout.
    et à la fin une fois que j'aurai compris, il faudrait que ma fonction soit un peu modifiée pour renvoyer un objet.
    et mais là avec le cout le "s3.getString()" me pose problème : y a t'il une fonction qui lit et affiche à l'écran les caractères d'un tableau ?

    si vous pouviez m'aider , ça serait très sympa

    Merci d'avance.

  5. #5
    Membre régulier Avatar de hamster
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2003
    Messages : 137
    Points : 123
    Points
    123
    Par défaut
    pourquoi n'utilises-tu pas la classe string standard ???

  6. #6
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    salut,

    n'utilises pas printf(), c'est du C ça et si tu fais du C++ il faut essayer de l'éviter au maximum (normalement on peut toujours s'en passer). pour les include il faut mettre <cstring>, c'est pareil que <string.h>, mais maintenant l'en-tete .h n'est plus standard (voir FAQ).

    au lieu de faire une méthode getString, fais une surcharge de l'opérateur de flux << dans la classe String afin de pouvoir écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    String s(...);
    ...
    cout << s;
    si tu ne sais pas faire, fais une recherche dans la FAQ ou sur Google, yora des exemples. et si tu veux vraiment utiliser getString(), alors c'est exactement la fonctino est la même, sauf que tu écriras
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    String s(...);
    ...
    cout << s.getString();

    Citation Envoyé par hamster
    pourquoi n'utilises-tu pas la classe string standard ???
    ça doit être un exercice j'imagine. j'ai déjà eu à faire une classe String en TP et kek années.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 80
    Points : 51
    Points
    51
    Par défaut
    ben je suis débutant et l'exo a été corrigé mais qq fonction ne l'ont pas été.
    j'aurai souhaité avoir un programme le plus complet possible mais j'ai bcp de mal.
    j'y vais étape par étape.
    je sais que fo mettre cout au lieu de printf mais j'essayais déjà de voir si j'arrivais à afficher un caractère.

    avant tout, ce que j'aimerai résoudre c comme afficher le caractère du tablo donc je connais pas le nom mais je sais que dans String y a un pointeur.
    je bloque là :

    j'essaie d'afficher les lettre de la chaine mais j'ai qu'un pointeur dans mon objet String.
    j'ai pas de nom de type tableau[i] à afficher. je veux afficher les cases du tabeau (inconnu?) désigné par le pointeur ptr,
    je pensais à un (s.(*ptr))[i] ça existe? c'est (le contenu du pointeur)de l'objet s. donc le contenu du pointeur est une case et je met [i] pour avoir la 1ère case.
    Merci

  8. #8
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    j'ai pas trop compris ce que tu essaies de dire.

    tu veux afficher les caractères pointés par 'ptr'. tu sais qu'il y a 'nbr' caractères (je suppose que nbr est le nombre de caractères pointés par ptr?).

    il te suffit de faire une boucle for grace à laquelle tu affiches les caractères 1 par 1.

  9. #9
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 36
    Points : 43
    Points
    43
    Par défaut
    si tu as

    alors les deux ecriture suivante sont identique

    a mon avis ce que tu cherche ressemble a


  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 80
    Points : 51
    Points
    51
    Par défaut
    Merci dok3, c exactement ce que je cherchais. je comprend mieux les choses pratiques

    j'avance un peu mieux

    à présent j'ai

    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
     
    class String
    {
    // private :
        int nbr;
        char *ptr; // <=> ptr[i]  <=>  *(ptr+i) 
        static int compteur; // les variables statiques sont implicitement initialisées à zéro
    public:
        String (char[]);
        String (char);
        ~String();
        String& operator=(const String &);
        String(const String &);
        String plus (const String &); 
        void getString();
        static int nombreChaines() {return compteur;}
    };                                   
     
    String::String(char ch[])
    {
        ++compteur;
        nbr=strlen(ch)+1;
        ptr=new char [nbr];
            for (int i=0;i<nbr;i++) // <=> strcpy(ptr,ch);
            ptr[i]=ch[i];  
    }
     
    String::String(char c)
    {
        ++compteur;
        nbr=2;
        ptr=new char[nbr];
        ptr[0]=c;
        ptr[1]='\0';    
    }
     
    String::~String()
    {
        --compteur;
        delete ptr;     
    }
     
    void String::getString(void)
    {
        int i;
        for(i=0;i<nbr;i++)
        cout<<ptr[i];
    }
     
    int main ()
    {
        String s1("azerty"),s2('q');
        cout<<"nombre d'objets = "<<String::nombreChaines(); 
        String s3=s1.plus(s2);
        s3.getString(); // OK
      //  cout<<"s3 = "<<s3.getString()<<endl;       probleme ICI
        s3=s1.plus('w');
        getch();
    }
    ma fonction getString marche mais comment la modifier pour que ça marche avec cout<<s3.getString() ??on veut que cout affiche une chaine de caractère donc que getstring renvoie ptr[i] ?
    je vois pas comment modifier cette fonction, ce qu'elle va renvoyer parce que cout peut afficher un carcatère à la fois donc comment peut il comprendre d'accéder plusieurs fois à getstring si getstring renvoyait un caractère.

    En regardant dans un livre, j'ai mis un compteur en privé statique et j'ai mis la fonction qui va avec.
    j'ai une les meme mesage d'erreur sur devc++ :
    fichier.cpp: linker error : more undefined references to `String::compteur' follow
    les lignes ne sont pas précisées par le compilo.

    (visual compile mais ne peux construire l'exécutable)

    Merci encore à vous tous

  11. #11
    Membre habitué Avatar de PINGOUIN_GEANT
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 149
    Points : 155
    Points
    155
    Par défaut
    c'est mieux que ta fonction getString renvoie qqchose si tu veux l'afficher.
    et l'opérateur d'injection doit être surchargé pour la classe de l'objet que tu renvoies.
    voir un cours sur la surcharge d'opérateur
    " Tout homme est digne d'un parapluie." Stavroguine dans Les Démons de Dostoïevski.

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 80
    Points : 51
    Points
    51
    Par défaut
    bonjour

    c'est mieux que ta fonction getString renvoie qqchose si tu veux l'afficher
    lol je sais aussi mais je sais pas comment faire
    qqn pourrait-il modifier ou m'indiquer comment modifier légèrement la fonction de façon àa ce que ça renvoie qqch (et renvoyer quoi? un char[] ?) de manière à ce que le cout puisse envoyer le "truc" renvoyé.

    l'opérateur d'injection doit être surchargé pour la classe de l'objet que tu renvoies
    what's that? ce qui veut dire plus explicitement?

  13. #13
    Membre habitué Avatar de PINGOUIN_GEANT
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 149
    Points : 155
    Points
    155
    Par défaut
    http://c.developpez.com/faq/cpp/?pag...RGE_definition

    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    friend ostream &operator<<(ostream &p,const myClass &m);
    " Tout homme est digne d'un parapluie." Stavroguine dans Les Démons de Dostoïevski.

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 80
    Points : 51
    Points
    51
    Par défaut
    String String::plus(const String &s)
    j'ai déjà ça pour surcharger l'operateur
    enfin j'avais fait une fonction operator+ mais bon je vois pas trop le rapport avec ce que je veux.

    est-ce que les modification sont vraiment importantes pour passer de s3.getString() à cout<<s3.getString() ?

    sinon tant pis, je vais me contenter de ce que j'ai.

  15. #15
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    avant de continuer, lis un tutoriel sur les flux (<<,>>) et sur la surcharge d'opérateurs. parce que là j'ai l'impression que tu fais de la bidouille.

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 80
    Points : 51
    Points
    51
    Par défaut
    salut

    je viens de voir, dans le code précédent que j'ai posté, y a une erreur où vous avez oublié de me répondre, en fait j'ai mis un compteur en privé statique et j'ai mis la fonction qui va avec.
    j'ai les meme mesage d'erreur sur devc++ :
    fichier.cpp: linker error : more undefined references to `String::compteur' follow
    les lignes ne sont pas précisées par le compilo.

    (visual compile mais ne peux construire l'exécutable)

    comment corriger cela?

    Merci bcp

  17. #17
    Membre habitué Avatar de PINGOUIN_GEANT
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 149
    Points : 155
    Points
    155
    Par défaut
    je pense que la réponse se trouve encore dans la FAQ
    http://c.developpez.com/faq/cpp/?pag...SS_init_static

    initialisation explicite en dehors de la déclaration de la classe
    " Tout homme est digne d'un parapluie." Stavroguine dans Les Démons de Dostoïevski.

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 80
    Points : 51
    Points
    51
    Par défaut
    MERCI BCP

    (je venais de lire dans un bouquin que la déclaration était implicite pour les var static, apparemment c pas le cas)

Discussions similaires

  1. Activation ou non d'une fonction d'affichage dans une fenêtre d'une image
    Par Aquarium33 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 30/03/2012, 11h30
  2. [XL-2000] recherche une fonction d'affichage particulier des colonnes
    Par pat91 dans le forum Excel
    Réponses: 20
    Dernier message: 24/05/2009, 00h45
  3. création d'une fonction d'affichage.
    Par Empty_body dans le forum Langage
    Réponses: 2
    Dernier message: 12/06/2007, 11h20
  4. Réponses: 1
    Dernier message: 23/02/2007, 08h49
  5. Affichage périodique d'une fonction
    Par boobob dans le forum C
    Réponses: 16
    Dernier message: 08/12/2003, 16h06

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