Difficultés avec les Pointeurs ;(

Statut
N'est pas ouverte pour d'autres réponses.

Xaab

Elite
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 :)

  • //
    #include <iostream>
    #include <iomanip>
    using namespace std;
    // supression des espaces blancs
    void eatspaces(char* str)
    {[list:f552068f92]int i=0; // index 'cible' de la chaine
    int j=0; // index 'source' de la chaine
    char lettre ='N';

    while(*(str + j) != '\0')
    {
    [list:f552068f92] *(str + i)= *(str + j++); // <=== ici ça foire le prog :cry:
    if (*(str+i) != ' ') i++;
}
return;[/list:u:f552068f92]}
// affichage
void affiche (char* str)
{
  • int i=0;
    while (*(str+i) != '\0')
    {
    [list:f552068f92]cout << *(str+i++);
}
cout << endl;
return;[/list:u:f552068f92]}

int main (void)
{
  • char* str="je me nomme Xavier";
    affiche(str);
    eatspaces(str);
    affiche(str);
    return 0;
}[/list:u:f552068f92]
 
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)
 
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"...
 
1er
OP
Xaab

Xaab

Elite
TITM4v3rick a dit:
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)
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 :)
 

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
 
1er
OP
Xaab

Xaab

Elite
CvM a dit:
[ examZ]pas besoin de passer en pointeur ;)
même pour l'affichage ..

str est déjà un pointeur vers le premier élément du tableau
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:
 
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".
 
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)
 
1er
OP
Xaab

Xaab

Elite
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:
 
1er
OP
Xaab

Xaab

Elite
Voici mon prog débugué. Je suis plutôt content :D

  • //
    #include <iostream>
    // #include <iomanip> pas besoin de ça
    using namespace std;
    // supression des espaces blancs
    void eatspaces(char* str)
    {[list:c40ff30aae]int i=0; // index 'cible' de la chaine
    int j=0; // index 'source' de la chaine
    char lettre ='N';

    while(*(str + j) != '\0')
    {
    [list:c40ff30aae] *(str + i)= *(str + j++); // <=== ici tout va bien maintenant :D
    if (*(str+i) != ' ') i++;
}
*(str+i)= '/0'; // J'avais oublié ça ^^
return;[/list:u:c40ff30aae]}
// affichage
void affiche (char* str)
{
  • int i=0;
    while (*(str+i) != '\0')
    {
    [list:c40ff30aae]cout << *(str+i++);
}
cout << endl;
return;[/list:u:c40ff30aae]}

int main (void)
{
  • char str[80]="je me nomme Xavier"; // ici ben fallait pas déclarer "str" comme pointeur. Donc pas mettre le * aprés le char ^^. Et allouer une taille à "str" donc mettre [80] derriere "str" ^^ :p
    affiche(str);
    eatspaces(str);
    affiche(str);
    return 0;
}[/list:u:c40ff30aae]
Merci beaucoup TITM4v3rick. :wink: THX
 

zoheir

cvm.mangaleet()
Xaab a dit:
CvM a dit:
[ examZ]pas besoin de passer en pointeur ;)
même pour l'affichage ..

str est déjà un pointeur vers le premier élément du tableau
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:
bin la prochaine n'utilise pas de pointeurs ;)
 
Statut
N'est pas ouverte pour d'autres réponses.
Haut