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 :

Tableaux et valeurs incorrectes


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2013
    Messages : 6
    Par défaut Tableaux et valeurs incorrectes
    Bonjour a tous. Je débute en C et j'aurais besoin de vos lumières.

    J'essaye de faire remplir un tableau par une fonction pour ensuite pouvoir continuer d'utiliser mon tableau dans mon programme principal.

    Dans ma fonction, les valeurs du tableau sont correctes.

    Dans mon programme principal, les valeurs sont incorrectes.

    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
     
    int getTabScore(int* scoreS)
    {
        FILE *fichier;
        char tampon[BUFSIZ];
        int actuel = 0, cpt = 0, c;
        fichier = fopen ("scores.txt", "r");
        if (!fichier)
            return EXIT_FAILURE;
        while ((c = fgetc (fichier)) != EOF) {
            if (c == ';'){
                actuel = 0;
                memset (tampon, 0, sizeof tampon);
            }
            else if (c == '\n'){
                scoreS[cpt] = atoi(tampon);
                cpt++;
                actuel = 0;
                memset (tampon, 0, sizeof tampon);
            }
            else
                tampon[actuel++] = c;
        }
        for (int j = 0; j <10; j = j+1)
        {
            printf("i: %d, score: %d",j, scoreS[j]);
            printf("\n");
        }
    }
     
     
    int main(int argc, char *argv[])
    {
        int* scores[10];
        getTabScore(scores);
        for (int j = 0; j <10; j = j+1)
        {
            printf("i: %d, score: %d",j, scores[j]);
            printf("\n");
        }
        return EXIT_SUCCESS;
    }
    Et voici les valeurs que me sort le printf:
    • dans la fonction getTabScore

      i: 0, score: 10000
      i: 1, score: 9000
      i: 2, score: 8000
      i: 3, score: 7000
      i: 4, score: 6000
      i: 5, score: 5000
      i: 6, score: 4000
      i: 7, score: 3000
      i: 8, score: 2000
      i: 9, score: 1000

    • dans le main

      i: 0, score: 10000
      i: 1, score: 8000
      i: 2, score: 6000
      i: 3, score: 4000
      i: 4, score: 2000
      i: 5, score: 19986320
      i: 6, score: 1901871984
      i: 7, score: -756535753
      i: 8, score: -48123601
      i: 9, score: -1227083849


    Je ne comprends pas pourquoi les valeurs sont differentes :/.

    Merci d'avance pour votre aide.

    Super-zen.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    Par défaut
    Si tu n'as pas de warning pour pointeur incompatible sur la ligne 35, c'est que ton compilo est mal réglé.
    Si tu en as un mais que tu as décidé de l'ignorer, c'est que tu peux abandonner dès maintenant la pratique du C pour stupidité terminale.
    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
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2013
    Messages : 6
    Par défaut
    Pas de warning sur la ligne 35.
    Je suis censé faire quoi pour "régler" mon compilo?

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 841
    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 841
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Médinoc Voir le message
    Si tu en as un mais que tu as décidé de l'ignorer, c'est que tu peux abandonner dès maintenant la pratique du C pour stupidité terminale.
    Ca c'est pas sympa. Mets-toi à la place d'un débutant qui galère pour que son code compile. Au bout d'un temps assez indéterminé, enfin son truc passe l'étape de la compilation mais il subsiste éventuellement quelques warnings. Ben pressé de tester son programme il les ignore et c'est normal quoi...
    J'en sais d'autant plus quelque chose que j'ai fait un peu de VisualStudio/C# dernièrement (je n'y ai jamais touché avant) et que j'ai eu un peu le même genre de réactions.
    Bon d'habitude t'es plus sympa que ça donc on va mettre ça sur le stress du WE qui commence

    Citation Envoyé par superzen Voir le message
    Pas de warning sur la ligne 35.
    Je suis censé faire quoi pour "régler" mon compilo?
    Eventuellement rajoute l'option -Wall mais si c'est trop galère à trouver, laisse tomber pour le moment. Au delà du compilateur, rien ne vaut un cerveau pour réfléchir...
    Donc tu parles d'un "tableau" à faire remplir. Mais un tableau de quoi on n'en sait rien. Tout ce qu'on sait, c'est qu'en ligne 34 tu déclares int* scores[10] qui est un tableau de 10 "int étoiles" (donc 10 pointeurs donc 10 adresses, chacune pointant sur un int). C'est possible bien entendu mais généralement les adresses sont gérées par le système et même si on peut avoir besoin de les stocker, on n'a jamais besoin de les "saisir manuellement" donc il est quasiment certain que là, ce n'est pas bon.

    Ensuite, tu passes en ligne 35 la variable "scores" à ta fonction. Le nom brut d'un tableau étant toujours l'adresse de son premier élément, cette variable "scores" est donc l'adresse de scores[0] (qui est un pointeur) donc "scores" est l'adresse d'un "int étoile" donc "scores" est un "int étoile étoile". Or la fonction getTabScore() étant prévue pour recevoir un "int étoile", à partir de là plus rien ne peut fonctionner correctement et on peut arrêter là le débug de ton code (l'adresse d'une adresse n'étant bien évidemment pas la même chose que l'adresse d'un entier)...
    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 à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2013
    Messages : 6
    Par défaut
    Merci beaucoup Sve@r, j'avais pas si bien compris que ça le cours sur les pointeurs finalement..

    Après avoir retiré cette méchante étoile le code fonctionne =).

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 841
    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 841
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par superzen Voir le message
    Merci beaucoup Sve@r, j'avais pas si bien compris que ça le cours sur les pointeurs finalement..
    On pourra toujours te les réexpliquer si besoin...

    Citation Envoyé par superzen Voir le message
    Après avoir retiré cette méchante étoile le code fonctionne =).
    Ok, mais rappelle-toi (surtout en C) que ce n'est pas parce qu'un code fonctionne qu'il est correct. Toutefois, une première lecture sommaire du tien ne m'a rien donné à redire.

    Citation Envoyé par Bktero Voir le message
    MDR ! En lisant Médinoc, je me suis dit "tiens, il se met à réagir comme Sve@r. Et voilà que Sve@r répond d'être plus gentil ! Jouissif
    Bah, ça dépend surtout du "ressenti" du post. Celui qui arrive en disant "bon alors voilà vous n'avez rien à m'apprendre parce que je sais tout mais je consent à accepter votre aide" se prend rapidement ma main virtuelle dans sa tronche virtuelle. Mais celui qui arrive manifestement aussi désespéré qu'un passager de 3° sur le Titanic le soir du 12 avril obtient très vite ma bouée de sauvetage virtuelle

    Citation Envoyé par superzen Voir le message
    Citation Envoyé par Bktero Voir le message
    Il faut savoir que les compilateurs ont des options pour qu'ils analysent plus "sévèrement" le code et émettent plus de warnings. On rappelle que les warnings sont des erreurs potentielles voire très potentielles. Les plus connues et que tu retrouves souvent dans les discussions ici sont -Wall et -Wextra de gcc, aussi utilisées avec MinGW, et globalement universellement comprises par les programmeurs C.
    Un warning, c'est (en résumé) un message du compilo disant "je ne suis pas certain d'avoir bien compris ce que vous voulez faire alors peut-être que je suis en train de faire une connerie avec votre code".
    Effectivement il vaut mieux s'arranger pour 1) demander au compilo le maximum de messages de ce genre si besoin et 2) s'arranger pour que, malgré ça, il n'ait pas de raison d'en envoyer.
    Et même malgré ça, un code C qui compile peut cacher quand-même nombre d'erreurs
    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]

  7. #7
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 494
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Envoyé par Médinoc
    Si tu en as un mais que tu as décidé de l'ignorer, c'est que tu peux abandonner dès maintenant la pratique du C pour stupidité terminale.
    Ca c'est pas sympa. Mets-toi à la place d'un débutant qui galère pour que son code compile.[...] Bon d'habitude t'es plus sympa que ça donc on va mettre ça sur le stress du WE qui commence
    MDR ! En lisant Médinoc, je me suis dit "tiens, il se met à réagir comme Sve@r. Et voilà que Sve@r répond d'être plus gentil ! Jouissif

    Je suis censé faire quoi pour "régler" mon compilo?
    Quel compilateur utilises-tu ?

    Il faut savoir que les compilateurs ont des options pour qu'ils analysent plus "sévèrement" le code et émettent plus de warnings. On rappelle que les warnings sont des erreurs potentielles voire très potentielles. Les plus connues et que tu retrouves souvent dans les discussions ici sont -Wall et -Wextra de gcc, aussi utilisées avec MinGW, et globalement universellement comprises par les programmeurs C.

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

Discussions similaires

  1. [Tableaux] recuperer valeurs dans checkbox
    Par lch07 dans le forum Langage
    Réponses: 14
    Dernier message: 05/01/2006, 15h06
  2. Erreur : Valeur incorrecte pour ce champ
    Par Invité dans le forum Access
    Réponses: 5
    Dernier message: 04/01/2006, 12h09
  3. [Tableaux] Recherche valeur dans tableaux
    Par Kaimann dans le forum Langage
    Réponses: 10
    Dernier message: 21/10/2005, 11h57
  4. [Tableaux] recuperation valeurs dun tableau ou d'un array
    Par pascale86 dans le forum Langage
    Réponses: 5
    Dernier message: 11/10/2005, 16h14
  5. Réponses: 2
    Dernier message: 19/08/2003, 18h04

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