Difficultés avec les Pointeurs ;(

Discussion dans 'Web, design' créé par Xaab, 14 Janvier 2004.

Statut de la discussion:
Fermée.
  1. Offline
    Xaab Touriste
    Salut tout le monde :)
    Voilà j'ai un gros problème :cry:
    J'apprend le C tant bien que mal :oops:
    Et je suis tombé sur un os :cry: Voyez plutôt:

    Ce prog passe tout seul à la compilation. J'ai 0 erreur et 0 warning.
    Mais quand je l'execute windows me le ferme en me proposant un rapport d'erreur.
    Je ne comprend pas pourquoi. J'ai mis la ligne qui me semble poser le bug en rouge.

    Si quelqu'un peut m'aider ce serai super simpa :)

    Xaab, 14 Janvier 2004
    #1
  2. Offline
    Déjà je vois des include de C++ et des commentaires aussi au format fin de ligne (cpp/java).

    Je vois que tu veux jouer avec des char *

    un char * c quoi ? C une fausse chaîne de caractères, il s'agit en fait d'un tableau de char dont on pointe le premier élément.

    Dis-nous ce que tu veux faire et dans quel language.
    Dis-nous si tu DOIS travailler avec des char * ou si tu peux bosser avec ds string :D #include <string> => c une classe de la STL définie ds l'espace de nom std. (c'est une classe template)

    Un pointeur, c juste comme son nom l'indique un pointeur...
    tu te représentes ça comme une grosse flèche vers un élément d'un ensemble (unique ou concaténé/contigü/accroché à un autre ensemble).

    un pointeur n'est pas un objet ou une variable (type primitif)
    TITM4v3rick, 15 Janvier 2004
    #2
  3. Offline
    Code:
    // 
    #include <iostream>
    #include <iomanip>
    using namespace std;
    // supression des espaces blancs
    void eatspaces(char* str)
    {
        int i=0; // index 'cible' de la chaine
        int j=0; // index 'source' de la chaine
        char lettre ='N';
    
        while(*(str + j) != '\0') {
            *(str + i)= *(str + j++); // <=== ici ça foire le prog
            if (*(str+i) != ' ') i++;
        }
        return;
    }
    // affichage
    void affiche (char* str)
    {
    
        int i=0;
        while (*(str+i) != '\0') {
            cout << *(str+i++);
        }
        cout << endl;
        return;
    }
    
    int main (void)
    {
    
        char* str="je me nomme Xavier";
        affiche(str);
        eatspaces(str);
        affiche(str);
        getchar();
        return 0;
    }
    
    /* Affiche ceci comme résultat
    
        je me nomme Xavier
        jemenommeXavierier
    
    */
    chez moi ça compile, même avec un inspecteur de code et ya pas de pb en-dehors, mais je ne dis pas que ce que tu fais ou veux faire est bon, disons la manière de l'obtenir...

    Un char * c'est un tableau si tu veux...

    => cout << str[4] << endl;

    ça affichera le caractère "e"...
    TITM4v3rick, 15 Janvier 2004
    #3
  4. Offline
    Xaab Touriste
    Ce que je veux faire. Ben apprendre petit à petit. Là c'est un prog qui est censé m'afficher:
    Code:
    Je me nomme Xavier
    puis m'enlever tous les espaces (avec la procédure 'eatspaces' justement c'elle qui plante) pour me réafficher:
    Code:
    JemenommeXavier
    Sans espaces donc.

    Je veux travailler sur du C++.

    Oui ce serait bien que j'utilise des pointeurs pour permettre aux procédures de s'échanger juste des adresses mémoires afin qu'elles puissent toutes travailler sur les même "variables" si je puis dire.

    Quand aux pointeurs je crois avoir à peut prés compris ce que c'est. En Basic on utilise PEEK et POKE pour faire la même chose. Mais c'est plus compliqué en basic :?

    Mais oui ce serait certainement plus pratique si j'utilisait des string. D'autant que je peut aussi les pointer il me semble :)
    Xaab, 15 Janvier 2004
    #4
  5. Offline
    zoheir cvm.mangaleet()
    pas besoin de passer en pointeur ;)
    même pour l'affichage ..

    str est déjà un pointeur vers le premier élément du tableau
    zoheir, 15 Janvier 2004
    #5
  6. Offline
    Xaab Touriste
    Oui j'me doute mais je dois apprendre. C'est pour ça que j'utilise des pointeurs. :?

    Sinon c'est sûr que je ne m'embarasserais pas de ces instruments de tortures :wink:
    Xaab, 15 Janvier 2004
    #6
  7. Offline
    oui mais non, le pointeur c pas fait pour t'embèter.

    Exemple pratique : pour une de mes classes (TStr)
    qui a comme membres privés :

    Code:
            char * str;
            unsigned taille;
    
            // ...
            unsigned debutChaine() const;
            unsigned finChaine() const;
    J'ai fais les méthodes suivantes (exemples, je ne met pas tout sinon, c'est pas compréhensible au premier abord)
    Une classe c'est un type (au même titre que int, double, etc... qui sont des types primitifs) MAIS créé par l'utilisateur, la classe string dont je te parlais plus haut est un type.
    Une classe c'est un moule (une fabrique) à objets...

    en C++:
    variable <-> objet (on peut assimiler les types primitifs à des objets)
    classe <-> objet

    Code:
    // une fonction trim
    TStr TStr::trim() const
    {
        unsigned debut=this->debutChaine();
        unsigned fin  =this->finChaine();
        ostringstream o;
        for (unsigned i=debut ; i<=fin ; i++)
            o << str[i];
        return o.str();
    }
    
    // pour connaître l'indice du premier caractère non vide => != ' '
    unsigned TStr::debutChaine() const
    {
        unsigned debut=0;
        bool commence=false;
        for (unsigned i=0 ; i<taille ; i++) {    // parcours de droite à gauche
            if (str[i] != ' ') {
                if (commence)
                    break;
                debut = i;
                commence = true;
            }
        }
        return debut;
    }
    
    // pour connaître l'indice du dernier caractère non vide => != ' '
    unsigned TStr::finChaine() const
    {
        unsigned fin=0;
        bool fini=false;
        for (unsigned i=taille ; i>0 ; i--) {    // parcours de gauche à droite
            if ((str[i] != ' ') && (str[i] != '\0')) {
                if (fini)
                    break;
                fin = i;
                fini = true;
            }
        }
        return fin;
    }

    Now dans ton cas, pourquoi ne pas faire une méthode ou fonction qui prend le char * de base, en extrait les caractères et les tapes dans une nouvelle chaîne..., ensuite tu fais un changement d'adresse, tu fais pointer str vers la chaîne temporaire OU tu effaces str et tu le recrées sur base du temporaire que tu effaceras lui même par la suite (mais ça c'est un peu lourd surtout que c'est pas utile) => tu alloues une nouvelle chaîne, tu copies ton str dedans, tu vires le str actuel et tu réorientes ton pointeur vers la "nouvelle chaîne".
    TITM4v3rick, 15 Janvier 2004
    #7
  8. Offline
    ah oui pour allouer, on fait

    Code:
    char * tab = new char[50]; // par exemple
    char * tab = new char[strlen(str)+1]; // sur base d'un autre char *
    pour désallouer c'est : ? (ça faut lire un peu Stroupstrup aussi)
    TITM4v3rick, 15 Janvier 2004
    #8
  9. Offline
    Xaab Touriste
    Oula bon je lit tout ça bien calmement. Il va me falloir un peut de temps pour bien comprendre. Puis je verrais si j'y arrive.

    En tous cas merci beaucoup. Tout seul je crois que je n'y arriverais pas :wink:
    Xaab, 15 Janvier 2004
    #9
  10. Offline
    Xaab Touriste
    Voici mon prog débugué. Je suis plutôt content :D

    Merci beaucoup TITM4v3rick. :wink: THX
    Xaab, 15 Janvier 2004
    #10
  11. Offline
    zoheir cvm.mangaleet()
    bin la prochaine n'utilise pas de pointeurs ;)
    zoheir, 17 Janvier 2004
    #11
Statut de la discussion:
Fermée.