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 :

Problème sur un char * pour redéfinir


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 447
    Par défaut Problème sur un char * pour redéfinir
    Bonjour,

    Je rencontre un problème inattendu sans doute et surement par manque de connaissance, donc voilà mon problème :

    J'ai une fonction Url_LinksSave qui est à l'intérieur d'une boucle while.

    Je déclare et définie dans ma fonction Url_LinksSave une chaine *pNumeroFileTxt = "000";

    Je modifie cette chaîne (toujours dans la même fonction) dans une boucle for et quand la boucle se termine pNumeroFileTxt vaut "099".

    Avant de sortir de ma fonction je redéfinie pNumeroFileTxt à "000".

    Mais quand je rentre à nouveau dans ma fonction Url_LinksSave j'ai remarqué avec horreur que le pNumeroFileTxt n'avait pas changé et était toujours à "099" et c'est ici que je ne comprends pas pourquoi :

    1) quand le programme lit la déclaration et la définition chaine *pNumeroFileTxt = "000"; pourquoi il ne me redéfini pas la chaîne à "000".

    2) quand le programme lit pNumeroFileTxt = "000" à la fin de ma fonction juste avant de sortir, pourquoi il ne fait pas la redéfinition.

    J'ai encore dû saper quelque chose sur le cours sur les chaînes de caractères LOL !

    Voici 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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    void Url_LinksSave(void)
    {   
      if(gPlaylist.nLink_Nb == 0)
      {
        printf("Aucun lien trouvé.\n");
      }
      else 
      {
        s32 i = 0, ii = 0;
     
        static s32 nNumeroFile=0; // Pour le n° du fichier. 
        char pFilenameTxt[FILENAME_OutputLg+1];
        char *pNumeroFileTxt = "000"; // La ligne qui pose problème.
        char *pExtensionFile = ".txt"; 
        char *pStrEnd = "\r\n";
        strcpy(pFilenameTxt, "Links000.txt");
     
        for(i = 0; i <= gPlaylist.nLink_Nb; i++)
        {
          // Ecriture des liens sur plusieurs fichiers par lot.
          if( ! ii % NB_LINKS_BY_FILE_Output)
          {
            if((gFilename.pFile = fopen(pFilenameTxt, "w")) != NULL){}
            else
            {
              fprintf("stderr, Unable to save %s\n", pFilenameTxt);
              exit(1);
            }
          }
     
          // On écrit les liens dans le fichier.  
          fwrite(gpLinksUrl[i].pLinkURL, strlen(gpLinksUrl[i].pLinkURL), 1, gFilename.pFile);
          // Saut de ligne.
          if(ii < NB_LINKS_BY_FILE_Output-1 && i < gPlaylist.nLink_Nb)
            fwrite(pStrEnd, sizeof(*pStrEnd), strlen(pStrEnd), gFilename.pFile);
     
          //Si on est arrivé au nombre de liens par fichier.
          if(++ii > NB_LINKS_BY_FILE_Output-1)// Si nb de liens  < nb de liens par lot.
          {
            fclose(gFilename.pFile);
            MyItoA(++nNumeroFile, pNumeroFileTxt);
            strcpy(pFilenameTxt, FILENAME_Save);
            strcat(pFilenameTxt, pNumeroFileTxt);
            strcat(pFilenameTxt, pExtensionFile);
            ii=0; 
          }
        }
     
        fclose(gFilename.pFile); 
        nNumeroFile = 0; pNumeroFileTxt = "000";
      }
    }
    Est-ce que je devrais modifier ma chaine caractère par caractère, est-ce que la nouvelle chaîne que je définie à la fin de ma fonction est à une autre adresse ?

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 447
    Par défaut
    Après recherche vue dans Le guide complet du langage C, Chapitre 10 Les Chaines de caractères p413-414.

    Ce sont des constantes chaînes .

  3. #3
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Il s'agit effectivement d'une singularité du C. J'en cause là-bas, notamment.

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par hbx360 Voir le message
    Mais quand je rentre à nouveau dans ma fonction Url_LinksSave j'ai remarqué avec horreur que le pNumeroFileTxt n'avait pas changé et était toujours à "099" et c'est ici que je ne comprends pas pourquoi :
    T'as demandé à Clément ?

    Citation Envoyé par hbx360 Voir le message
    est-ce que la nouvelle chaîne que je définie à la fin de ma fonction est à une autre adresse ?
    Exactement ça. Quand tu écris char *pt="toto" ; si tu écris ensuite pt="titi" voilà ce qui se passe: tu définis deux chaines statiques "toto" et "titi" en mémoire, situées donc à deux adresses différentes (par exemple 0x1000 et 0x2000).
    Ensuite tu assignes la première adresse (0x1000) à "pt". Puis, tu lui assignes ensuite la seconde adresse "0x2000".

    Ce n'est pas foncièrement interdit (bien que ce soit dommage d'avoir perdu "toto" qui continue à exister pour rien). Et même si tu affiches le contenu de "pt" après chaque assignation tu auras "toto" et "titi" donc tu auras l'impression que la chaine a changé (comme un dessin animé qui montre une animation alors qu'il n'est composé que d'une succession de dessins fixes). Mais si tu vas plus en profondeur et que tu affiches la valeur de "pt" tu verras qu'elle aussi a changé. Et si tu tentes de modifier un caractère de "pt" là tu vas dans le mur (chaines statiques).

    Si tu veux modifier une chaine placée en mémoire, le mieux est alors de copier cette chaine dans un tableau de char pour pouvoir ensuite modifier à loisir son contenu (si Clément est d'accord bien évidemment )
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 447
    Par défaut
    Merci pour votre aide et explication.

    Oui j'ai choisie de passé par des tableaux de char c'est mieux.

    @Sve@r :
    T'as demandé à Clément ?

    si Clément est d'accord bien évidemment

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

Discussions similaires

  1. [2008] Problème sur utilisation bcp pour export dans fichier texte
    Par dimitrak dans le forum Outils
    Réponses: 2
    Dernier message: 06/07/2015, 08h09
  2. Problème sur fichier macro pour changer des éléments
    Par Dayo18 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 05/06/2015, 08h26
  3. Réponses: 2
    Dernier message: 21/09/2014, 22h52
  4. problème sur un code pour supprimer un fichier
    Par Bricoltou dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 03/02/2010, 19h17
  5. problème sur une macro pour une conversion en VB6.3
    Par Zoldick dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 06/06/2008, 14h41

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