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 :

problemes de pointeurs


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 9
    Par défaut problemes de pointeurs
    Salut,

    J'ai actuellement un probleme avec une fonction censée convertir un entier long en une chaine de caractères :

    La fonction a trois arguments : l'entier a convertir, le pointeur vers une chaine de caractères ou l'on doit ecrire la chaine, et la base.
    Seulement, il y a un probleme , et quand j'essaye d'afficher la chaine a l'ecran, je n'obtient pas la chaine souhaitée.

    Voici le 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
    #include <iostream>
    using namespace std;
     
    void DecToChar(long, char*, int);
     
    int main()
    {
    	long i;
    	char* buf = new char[32];
    	i = 16565;
    	DecToChar(i, buf, 10);
    	cout <<buf<<endl;
    	system("pause");
    }
     
    void DecToChar(long Dec, char* out, int radix)
    {
    	char tableau[33];
    	register int i;
    	for(i = 31; Dec != 0 && i >= 1; i--)
    	{
    		tableau[i] = (Dec % radix) >= 10 ? 0x57 + (Dec % radix) : 0x30 + (Dec % radix);
    		Dec /= radix;
    	}
    	tableau[32] = '\0';
    	out = new char[32-i];
    	register int j;
    	for(j = 0; i < 33; out[j] = tableau[i], i++, j++);
    }
    et j'obtient (sur la console) :════════════════════════════════²²²²½½½½½½½½¯■¯■
    Appuyez sur une touche pour continuer...

    Aucun probleme de compilation.
    Je pense qu'il y a un probleme au niveau du pointeur char, mais je ne suis pas sur.

    PS : je suis un debutant, je ne suis peut etre pas au point sur certaines choses.

    Merci.

  2. #2
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Tu fais du C, pas du C++...

    Si tu veux faire du C++, utilises plutôt des std::string et des flux pour convertir les données.

    Si tu veux faire du C, demandes dans le forum C...

    Mais déjà, en regardant très rapidement ton code, tu accède peut-être à l'élément 32 du tableau buf qui s'arrête à 31... (mais je n'ai pas regardé de très près...)

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 577
    Par défaut
    sinon tu peux aussi utiliser :
    char *_ltoa( long value, char *string, int radix );

    ou carrément sprintf()

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Sauf qu'à mon avis, il était question de reproduire la fonction _itoa()...
    Qui n'est pas standard, soit dit en passant...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 9
    Par défaut
    Citation Envoyé par Médinoc
    Sauf qu'à mon avis, il était question de reproduire la fonction _itoa()...
    Oui en fait c'etait plutot ca...

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    À, j'ai trouvé le problème: Tu essaies de modifier out, mais c'est une variable locale.
    Pour rester en C, il faudrait utiliser un pointeur de pointeur, ou pour rester conforme à la spec d'itoa(), toujours utiliser un buffer d'au moins 33 caractères.
    Sans oublier que pour l'instant, on ne gère pas le signe négatif...

    Déjà un petit code qui écrit sur out avec un bète strcpy()...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void DecToChar(long Dec, char* out, int radix)
    {
    	char tableau[33];
    	size_t i;
    	tableau[33-1] = '\0';
    	for(i = 33-1 ; Dec != 0 && i >= 1 ; )
    	{
    		int chiffre = (Dec % radix);
    		i--;
    		tableau[i] = ((chiffre >= 10) ? ('A' + chiffre-10) : ('0' + chiffre));
    		Dec /= radix;
    	}
    	strcpy(out, tableau+i);
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 9
    Par défaut
    bon, d'accord.
    Merci a vous.

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

Discussions similaires

  1. probleme de pointeur ....
    Par berg dans le forum C
    Réponses: 6
    Dernier message: 12/01/2006, 22h46
  2. Probleme de pointeur
    Par Naruto_kun dans le forum C
    Réponses: 17
    Dernier message: 14/12/2005, 20h47
  3. Probleme de pointeurs
    Par mickyoun dans le forum C++
    Réponses: 9
    Dernier message: 10/08/2004, 17h15
  4. Probleme de pointeur sur une fonction
    Par nicky78 dans le forum C
    Réponses: 2
    Dernier message: 23/05/2004, 20h26
  5. probleme avec pointeurs de structures
    Par remi77 dans le forum C
    Réponses: 2
    Dernier message: 20/10/2003, 13h19

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