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 :

ma variable change en dehors de ma boucle


Sujet :

C

  1. #1
    Membre du Club Avatar de suzan_
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 87
    Points : 41
    Points
    41
    Par défaut ma variable change en dehors de ma boucle
    Bonjour à tous!

    Je sais que ce problème à surement déja été traité, mais je ne le comprends vraiment pas.
    Voila, je lis un fichier texte dont chaque ligne contient une adresse, je veux stocker chaque adresse (donc chaque ligne) dans un tableau.Chaque ligne de mon tableau contiendrait donc une ligne de mon fichier texte.

    J'ai fais ça :

    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
     
    int var =0;
    int l=0;
    FILE* fichier = NULL;
    char tab_image[1000];
    char chaine[1000] = "";
     
    fichier=fopen("image_list_complete.txt","r");
     
        if (fichier != NULL)
        {	
    		while (fgets(chaine, 1000, fichier) != NULL)
                   {
    			tab_image[var]=chaine;
    			printf("var = %d\n",var);
    			printf("%s\n",tab_image[var]);
    			var=var+1;
    		}
            fclose(fichier);
        }
     
    	for(l=0;l<5;l++){
    	printf("%s\n",tab_image[l]);
    	}
    le premier printf marche exactement comme je le veux, mais le deuxieme m'affiche toujours le même contenu : comme si toutes les lignes de mon tableau contenait la dernière adresse qui était dans mon fichier texte. Pourquoi?

    Merci d'avance

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 372
    Points : 23 628
    Points
    23 628
    Par défaut
    Bonjour,

    Effectivement, ce programme ne peut pas fonctionner en l'état. Ne serait-ce que parce que tu réserves bien de l'espace pour lire une chaîne, d'un maximum de mille caractères, avec chaine[1000], mais pas pour stocker les suivantes.

    Chaque chaîne écrase donc la précédente dans ton buffer, mais ta ligne 14 ne duplique pas la chaîne (vers un espace qui resterait à définir, de toutes façons), mais copie le pointeur de chaîne, quelque part à l'intérieur de ton tableau. Et d'ailleurs, de la manière dont c'est fait, le compilateur devrait lever une erreur et refuser de produire l'exécutable.

    Quoi qu'il en soit, tu stockes n fois la même adresse dans ton tableau tab_image, cette adresse est celle de ton buffer « chaine », et celui-ci contient bien, par conception, la dernière ligne que tu aies lue dans ton fichier.

  3. #3
    Membre du Club Avatar de suzan_
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 87
    Points : 41
    Points
    41
    Par défaut
    C'est bien ce que je pensais...
    Donc il faudrait que je déclare un tableau comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     char tab_image[50][1000]
    Un tableau avec 50 lignes qui peuvent contenir chacune 1000 caractères?

    j'ai essayé avec ça et il ne veut pas me compiler à cause de cette ligne : merci de ton aide en tout cas

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 372
    Points : 23 628
    Points
    23 628
    Par défaut
    Citation Envoyé par suzan_ Voir le message
    C'est bien ce que je pensais...
    Donc il faudrait que je déclare un tableau comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     char tab_image[50][1000]
    Un tableau avec 50 lignes qui peuvent contenir chacune 1000 caractères?
    C'est tout-à-fait cela !

    À ceci près toutefois que déclarer des tableaux de cette façon provoque l'allocation de leur mémoire dans la pile et que 50 Ko, ça commence à faire beaucoup. Mais cela reste ce qu'il y a de plus simple dans un premier temps.

    j'ai essayé avec ça et il ne veut pas me compiler à cause de cette ligne :
    C'est normal : « chaine », invoqué tout seul, est un pointeur (donc généralement sur 4 ou 8 octet) et « tab_image[var] » est un caractère (le varième caractère du tableau tab_image). Tu ne peux donc pas copier un pointeur dans un caractère. Et dans tous les cas, cela dupliquerait le pointeur qui pointe l'emplacement de la chaîne en mémoire. Cela ne dupliquerait pas la chaîne proprement dite. Pour ce faire, il faut copier tous les caractères (utiles) de ton tableau vers un autre tableau. Il existe une fonction dédiée pour faire cela : strncpy().

    Cela dit, maintenant que tu as déclaré un tableau à deux dimensions, il suffit de passer directement la bonne rangée du tableau à fgets() pour qu'elle aille directement stocker la chaîne dedans plutôt que passer par un buffer intermédiaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (fgets(tab_image[var],1000,fichier) != NULL)

    merci de ton aide en tout cas
    À ton service.

  5. #5
    Membre du Club Avatar de suzan_
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 87
    Points : 41
    Points
    41
    Par défaut
    Cela dit, maintenant que tu as déclaré un tableau à deux dimensions, il suffit de passer directement la bonne rangée du tableau à fgets() pour qu'elle aille directement stocker la chaîne dedans plutôt que passer par un buffer intermédiaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (fgets(tab_image[var],1000,fichier) != NULL)
    Ah !! Mais c'est bien sur!! Quelle sotte je fais!! Merci beaucoup en tout cas car je me prenais la tête sur un truc tout bête comme ça!! Maintenant ça marche!!

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/09/2011, 19h10
  2. Créer un nom de variable qui s'incrémente dans une boucle
    Par Pietro_L dans le forum Général VBA
    Réponses: 3
    Dernier message: 09/05/2007, 15h10
  3. Variable égal au résultat d'une boucle
    Par arnaudperfect dans le forum Langage
    Réponses: 2
    Dernier message: 30/03/2007, 17h23
  4. afficher variable en dehors de sa boucle
    Par metatron dans le forum Langage
    Réponses: 6
    Dernier message: 23/08/2006, 18h21
  5. Réponses: 4
    Dernier message: 11/05/2006, 11h28

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