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

Bibliothèque standard C Discussion :

probleme tableau c, fgets


Sujet :

Bibliothèque standard C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 24
    Points : 14
    Points
    14
    Par défaut probleme tableau c, fgets
    Bonjour,

    voila mon probleme.Je n'arrive pas à remplir un tableau de manière constante, je m'explique. Je rempli mais le premier indice ne garde pas sa valeur. tab1[i] a la même valeur partout.

    Je doit avoir un probleme avec les pointeurs, mais je ne suis pas un specialiste du c donc ca me passe au dessus de la têtet depuis quelques heures.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    char temp [10],temp2[10];
    int tab1[50],tab2[50];
     
    while (!feof(fichier)){
    fgets (temp, 10,fichier);
    tab1[i]=temp;
    fgets (temp2, 10,fichier);
    tab2[i]=temp2;
    i=i++;
    }
    j'ai abrégé le code en gardant ce qui pose probleme,

    merci de vos reponses

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    i=i++;
    Comportement indéfini: Deux modifications de i dans la même séquence.
    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.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 24
    Points : 14
    Points
    14
    Par défaut
    tout d'abord merci de la reponse,

    merci... mais je ne vois pas ce que ca veux dire. i=i++; c'est dans la boucle et justement pour changer l'indice à chaque tour de boucle. Je n'y touche qu'une fois par tour.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 24
    Points : 14
    Points
    14
    Par défaut
    OK après recherche sur la reponse que j'ai eu sur le c je crois que i=i++ n'existe pas en c. i++ doit suffire.

    merci de la reponse ca m'a mis sur la bonne voie je crois.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    i = i++ cause deux modifications, donc peut avoir deux comportement possibles.
    Soit le code est équivalent à ceci, qui fait ce que tu veux:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int __tmp1 = i;
    i = __tmp1;
    i++;
    Soit il est équivalent à ceci, qui donne ton bug:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int __tmp1 = i;
    i++;
    i = __tmp1;
    En clair, le i++ est garanti ne se faire qu'après le __tmp1 = i, mais selon le standard, il peut être aussi bien avant le i = __tmp1 qu'après.
    Résultat, cela dépend du compilo.
    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.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 24
    Points : 14
    Points
    14
    Par défaut
    et non ca ne marche pas

    bon je remet le code avec les test

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    	int i=0;
     
    	while (!feof(fichier)){	
    		fgets (temp, 10,fichier);		
    		tab1[i]=temp;
    		puts (tab1[i]);					
    		fgets (temp2, 10,fichier);		
    		tab2[i]=temp2;		
    		i++;
    	}
    	puts (tab1[0]);
    	puts (tab1[1]);
    	puts (tab1[2]);
    ceci avec les declaration que j'ai mis auparavant.

    voila ce que me donne le l'execution

    1000

    1001

    1002

    1002

    1002

    1002

    1002
    alors que je m'attend plutot à
    1000
    1001
    1002
    1000
    1001
    1002
    en effet les valeurs recupérées et censées être stockées dans le tableau sont 1000, 1001, et 1002

  7. #7
    Membre expérimenté Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Points : 1 544
    Points
    1 544
    Par défaut
    bonjour,

    comportement normal, tu mets une valeur dans temp, puis tu enregistres l adresse de temp dans ton tableau, puis boucle suivante tu modifies la valeur de temp sans bouger l adresse sur lequel il pointe et tu enregistres a nouveau cette adresse (la meme qu au passage precedent)....

    en fait tu stock 3 fois la meme adresse en modifiant 3 fois son contenu, c est donc normal qu a la fin tes 3 pointeurs qui contiennent la meme adresse pointe sur la meme valeur, la derniere lue.

    Faut changer la declaration de tab1 et tab2 en char tab1[nb_mot][taille_mot] et non pas affecter des les pointeurs mais copier les chaines avec strcpy.
    (sinon la declaration peux aussi etre char** tab1 mais faudra lui allouer de la memoire avec malloc)
    "vaste programme"

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 24
    Points : 14
    Points
    14
    Par défaut
    je sent que c'est la bonne voie... mais je vois pas encore ce qu'il faut faire.

    Avec mon bout de code je recupère bien les valeurs que je veux (1000,1001 etc...), mais en stockant dans le tableau je stocke donc l'adresse de ces valeurs.

    L'adresse ne change pas, mais je change la valeur dans cette adresse (si je suis bien).

    donc le probleme c'est que fgets donne à temp la valeur d'une adresse et cette adresse correspond à la valeur que je veux? ou bien quand je stocke temp je stocke l'adresse de temp et quand je vais regarder il me donne la valeur à cette adresse?

    Concernant la creation du tableau tab1 tu veux juste que je remplace mes 2 tableaux en 1 tableau à 2 dimension? En fait l'idée c'est que dans le fichier je recupère une valeur de ligne pour la mettre dans un tableau, la deuxième dans un autre, la troisieme dans le premier etc..., tout en mettant ces valeurs en int pour faire des calculs dessus.

    bref, j'ai essayé ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fgets (temp, 10,fichier);		
    		strcpy(tab1[i],temp);
    et l'execution donne erreur de segmentation (que je mette tab1 en char ou en int)

  9. #9
    Membre expérimenté Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Points : 1 544
    Points
    1 544
    Par défaut
    un int n est pas un pointeur, meme si sur beaucoup d architecture la taille d un int est egale a la tailel dun pointeur et ce qui fait qu on peut ecrire ce genre de truc pas tres beau (pour pas dire franchement moche).

    Le segfault est normal, un pointeur contient une adresse mais si cette adresse est invalide (pointe n importe ou, sur NULL ou sur un espace non reservé) ca plante (enfin comportement indéfini, mais ca plante souvent).

    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
     
    char temp [10],temp2[10];
    char tab1[3][50],tab2[ 3 ][50];
    /* char tab1[ nb_mots ][ taille_mot ] */
     
    while (!feof(fichier)){	
    		fgets (temp, 10,fichier);		
    		strcpy( tab1[i], temp );
    		puts (tab1[i]);					
    		fgets (temp2, 10,fichier);		
    		strcpy( tab2[i], temp2 );		
    		i++;
    	}
    	puts (tab1[0]);
    	puts (tab1[1]);
    	puts (tab1[2]);
    }
    voila je te donne une solution (pas la meilleur, mais la plus simple et pas beaucoup de temps), par contre je t invite a lire un ou deux tutos parce que si tu veux continuer le C va falloir que tu assimiles completement les notions d adresses, de valeurs et de pointeurs.

    Voila, bon courage.
    "vaste programme"

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 24
    Points : 14
    Points
    14
    Par défaut
    je teste ca

    merci pour le conseil sur le C. Normalement je n'en fait pas, mais dans le cadre d'une formation du soir je me retrouve à devoir faire un projet et le C a été choisit.

    PS : j'ai testé ca a l'air de marcher (mais je sais pas pourquoi). J'espère que le reste va suivre

    en tous les cas merci pour le temps passé à me repondre


    Edit : je sais pas pourquoi ca marche, mais je vais essayer de comprendre

  11. #11
    Membre expérimenté Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Points : 1 544
    Points
    1 544
    Par défaut
    Re,

    ca marche en autre grace a la declaration de tab1

    chacune des 3 cases du tableau contient un autre tableau de 50 cases de type char.
    Pour utiliser un pointeur, il faut qui possede une adresse valide donc soit on lui donne l adresse d un autre objet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char* pt_char ;
    char valeur;
    
    pt_char = &valeur
    ou bien on lui alloue (reserve) de la memoire avec malloc.

    declarer un pointeur ne reserve jamais de la memoire !
    Et en C on n a le droit d utiliser que la memoire qui nous appartient.
    "vaste programme"

  12. #12
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    entre parenthèses, feof ne fait pas ce que tu crois...

    Son usage n'est pas celui-ci.

    La manière correcte d'écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while (!feof(fichier)){	
    		fgets (temp, 10,fichier);
    est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (fgets (temp, 10,fichier) != NULL) {
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 24
    Points : 14
    Points
    14
    Par défaut
    BainE

    decidement c'est bizarre, parce que sans changer la longueur du tableau et en augmentant le nombre de données (j'en recupère 40 et pas 3), ca fonctionne pareil.

    souviron34 :

    merci de l'info

    pour finir j'abandonne ce projet, je repasserai mes UE l'année prochaine si j'ai le temps d'apprendre le c d'ici la, parce que les histoire de pointeur, la conversion de type quand ca veux et les caractères invisibles qui se rajoutent tout seul... Ca me depasse vraiment trop. Apprendre ca juste pour faire un projet pour passer une UE..(on apprend pas le langage, on s'en sert juste, c'est censé être evident alors que ce n'est pas dans les prérequis). Je viens de passer beaucoup trop d'heures pour ne même pas attaquer le vrai projet (gestion des priorités), juste pour comprendre le C.

    J'ai tenté ma dernière carte ici, et même si vous m'avez donné plein de solution, le c me reste trop obscur.

    Merci de votre aide

  14. #14
    Membre expérimenté Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Points : 1 544
    Points
    1 544
    Par défaut
    Citation Envoyé par Qinqin Voir le message
    BainE
    decidement c'est bizarre, parce que sans changer la longueur du tableau et en augmentant le nombre de données (j'en recupère 40 et pas 3), ca fonctionne pareil.
    Purement de la chance.
    Tu ecris sur de la memoire qui ne t appartiens pas mais comme ton prog ne dois pas utiliser d autres espaces memoire (ni aucun des autres pro qui tourne sur ton PC) ca marche mais c est un comportement indéterminé, le jour ou une appli va demander la memoire que tu utilises hors du tableau si ca plante pas ca t affichera n importe quoi.
    "vaste programme"

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

Discussions similaires

  1. probleme : tableau & mise en forme
    Par grumly22 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 03/04/2006, 22h53
  2. [Conception] problème tableau 2 dimensions
    Par Tootsi dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 24/01/2006, 18h55
  3. probleme tableau
    Par semaj_james dans le forum C
    Réponses: 3
    Dernier message: 24/11/2005, 11h55
  4. [Tableaux] Probleme tableau
    Par chocobos dans le forum Langage
    Réponses: 3
    Dernier message: 10/09/2005, 11h34
  5. [C++] Probleme tableau
    Par yanndublanche dans le forum C++
    Réponses: 9
    Dernier message: 21/10/2004, 16h42

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