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 :

Parcourir et modifier un char*


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 102
    Par défaut Parcourir et modifier un char*
    Bonsoir tout le monde,

    Voila j'ai un petit problème avec une fonction, en effet je lui donne un parametre un pointer et j'aimerai avancé dans celui-ci afin de pouvoir lui ajouter des caractères. Je m'y prend donc pour l'appel de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    unsigned char* vFinalBuffer = (unsigned char*) calloc(86 ,sizeof(char));
    printf("1 : %p \n",vFinalBuffer );
    maFonction(......, 4, vFinalBuffer);
    printf("2 : %p \n",vFinalBuffer );
    maFonction(......, 4, vFinalBuffer);
    printf("3 : %p \n",vFinalBuffer );
    maFonction(......, 4, vFinalBuffer);
    exit(0);
    Je fais donc appels X fois à la meme fonction qui en fonction des parametres permet de modifier mon unsigned char* vFinalBuffer.

    Et donc voici maFonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void base64encode(......., int pSize,
    		unsigned char* pBuffer) {
    	char *vTmp = pBuffer;
    	printf("Nombre de boucle : %d",pSize);
    	for (i = 0; i < pSize; i++) {
    		(*vTmp++) = base64[vIndex & 0x3f]; //On lui assigne une valeur
    	}
    	printf("TMP => %s \n", pBuffer);
    }
    Or le problème, c'est que lorsque je lance le programme, je vois que l'adresse du pointer de vFinalBuffer reste toujours la meme alors que normalement elle aurait du etre modifié.

    Merci par avance.

  2. #2
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2012
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 190
    Par défaut
    salut !

    pour modifier le pointeur vFinalBuffer à l'appel de ta fonction, tu dois passer son adresse
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maFonction(......, 4, &vFinalBuffer);
    et bien sûr la déclaration et le code de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void base64encode(......., int pSize,
    		unsigned char** pBuffer) {
    	char *vTmp = *pBuffer;
    ...
    A+

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 102
    Par défaut
    Salut,

    Le problème c'est si j'utilise la solution proposé, je n'arrive toujours pas à avancer dans mon pointeur, voici la sortie :
    1 : 0xbfff4c60
    Nombre de boucle : 4TMP => ��c �
    2 : 0x9638190
    Nombre de boucle : 4TMP => ��c �
    3 : 0x9638190
    Nombre de boucle : 4TMP => ��c �
    Sa avance après le premier appel, mais pas pour la suite. Et surtout maintenant ça n'affiche meme plus les caractères présents.

  4. #4
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2012
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 190
    Par défaut
    les ... sont aussi à corriger
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	for (i = 0; i < pSize; i++) {
    		(*vTmp) = base64[vIndex & 0x3f]; //On lui assigne une valeur
                    (*pBuffer)++;
    	}
    :

    A+

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 102
    Par défaut
    Salut,

    J'ai effectué la correction mais j'ai toujours le problème

    Voici la sortie :
    1 : 0xbfb62d80
    TMP => x
    Ap 1 : x
    2 : 0x85b5190
    TMP => 1
    Ap 2 : 1
    3 : 0x85b5190
    TMP => /
    Ap 3 : /
    Valeur finale : /
    Et le code complet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void maFonction(........., int pSize,
    		unsigned char** pBuffer) {
    	char *vTmp = *pBuffer;
    	//Permet de stocker les 3 char dans un int afin de pouvoir faire du bit shiffting/masking
    	for (i = 0; i < pSize; i++) {
    		//On applique un masque et on le rajoute à notre chaine
    		(*vTmp) = base64[vIndex & 0x3f];
    		(*pBuffer++);
    	}
    	printf("TMP => %s \n", vTmp);
    }
    Et l'appel reste le meme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    printf("1 : %p \n",&vFinalBuffer );
    	maFonction(......., 4, &vFinalBuffer);
    	printf("Ap 1 : %s \n",vFinalBuffer);
    	printf("2 : %p \n",vFinalBuffer );
    	maFonction(......., 4, &vFinalBuffer);
    	printf("Ap 2 : %s \n",vFinalBuffer);
    	printf("3 : %p \n",vFinalBuffer );
    	maFonction(......., 4, &vFinalBuffer);
    	printf("Ap 3 : %s \n",vFinalBuffer);
    	printf("Valeur finale : %s \n",vFinalBuffer);
    	exit(0);
    Par contre, si je modifie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ....
    (*pBuffer++);
    ....
    Par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ....
    (*vTmp++);
    ....
    Alors j'arrive bien à avoir une chaine de plusieurs caractères qui se suivent :
    1 : 0xbfe6c2e0
    TMP =>
    Ap 1 : m39x
    2 : 0x8ea1190
    TMP =>
    Ap 2 : wS51
    3 : 0x8ea1190
    TMP =>
    Ap 3 : Ia4/
    Valeur finale : Ia4/
    Donc j'ai bien mon char* passé en parametre qui est modifié mais là j'avance plus dans le char* donc j'écrase à chaque fois. Donc là je dois retourne à moins point de départ pour lequel je comprend pas pourquoi il incrémente pas l'adresse :'(

  6. #6
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    De toute façon, tu ne dois pas modifier vFinalBuffer. Celui-ci contient une adresse renvoyée par un calloc(), et un jour ou l'autre tu devras faire un free() de cette adresse. Il faut donc la conserver.
    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
    unsigned char* vFinalBuffer = (unsigned char*) calloc(86 ,sizeof(char));
    unsigned char* p = vFinalBuffer;
    printf("1 : %p \n",p );
    maFonction(......, 4, &p);
    printf("2 : %p \n",p );
    maFonction(......, 4, &p);
    ....
    free(vFinalBuffer);
    ....
     
    void maFonction(...., int pSize, unsigned char** pBuffer)
    {
        int i;
        unsigned char *vTmp = *pBuffer ;
        for (i = 0; i < pSize; i++) *vTmp++ = base64[vIndex & 0x3f];
        *pBuffer = vTmp;
    }
    Maintenant, tu peux aussi utiliser la valeur de retour des fonctions :
    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
    unsigned char* vFinalBuffer = (unsigned char*) calloc(86 ,sizeof(char));
    unsigned char* p = vFinalBuffer;
    printf("1 : %p \n",p );
    p  = maFonction(......, 4, p);
    printf("2 : %p \n",p );
    p = maFonction(......, 4, p);
    ....
    free(vFinalBuffer);
    ....
     
    unsigned char* maFonction(...., int pSize, unsigned char* pBuffer)
    {
        int i;
        for (i = 0; i < pSize; i++) *pBuffer++ = base64[vIndex & 0x3f];
        return pBuffer;
    }

Discussions similaires

  1. deux facons de modifier un char
    Par deubelte dans le forum C++
    Réponses: 16
    Dernier message: 30/01/2009, 11h56
  2. Modifier une char* dans une fonction
    Par kase74 dans le forum Débuter
    Réponses: 6
    Dernier message: 20/01/2009, 21h06
  3. Parcourir et modifier noeuds xml
    Par snopims dans le forum ASP.NET
    Réponses: 1
    Dernier message: 08/12/2008, 12h00
  4. Parcourir et modifier une collection/generique
    Par kaervas dans le forum Débuter
    Réponses: 5
    Dernier message: 24/04/2008, 14h38
  5. Parcourir et modifier Dictionnary
    Par TSalm dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 05/11/2007, 11h30

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