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

  1. #1
    Nouveau Candidat au Club
    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
    Points : 1
    Points
    1
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    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 381
    Points : 41 582
    Points
    41 582
    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.

  3. #3
    Nouveau Candidat au Club
    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
    Points : 1
    Points
    1
    Par défaut
    Pas de warning sur la ligne 35.
    Je suis censé faire quoi pour "régler" mon compilo?

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 721
    Points : 31 044
    Points
    31 044
    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)...

  5. #5
    Nouveau Candidat au Club
    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
    Points : 1
    Points
    1
    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
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 483
    Points : 13 681
    Points
    13 681
    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.

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 721
    Points : 31 044
    Points
    31 044
    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

  8. #8
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 483
    Points : 13 681
    Points
    13 681
    Billets dans le blog
    1
    Par défaut
    Oh oui. Je viens de passer 3 jours à déboguer des erreurs incompréhensibles avec une application qui marchait mais pas toujours. Il fallait juste décaler l'accolade fermante d'un if d'un cran pour en sortir une ligne.

  9. #9
    Nouveau Candidat au Club
    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
    Points : 1
    Points
    1
    Par défaut
    Le compilateur que j'utilise est C99 (c’était lui par défaut, j'y ai pas touché, je m'y connais pas assez pour modifier ce genre de paramètre).

    Je me retrouve face a un autre problème que je ne comprends pas.

    Voila le code que j’exécute :

    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 getTabPseudo(char** pseudo)
    {
        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 == ';'){
                pseudo[cpt] = tampon;
                cpt++;
                actuel = 0;
                memset (tampon, 0, sizeof tampon);
            }
            else if (c == '\n'){
                actuel = 0;
                memset (tampon, 0, sizeof tampon);
            }
            else
                tampon[actuel++] = c;
        }
    }
     
    int main(int argc, char *argv[])
    {
        int scoreS[10];
        char pseudoS[10][3];
     
        getTabScore(scoreS);
        printf("GetTabScore\n");
        for (int i = 0; i< 10; i++){
            printf("%d\n", scoreS[i]);
        }
        getTabPseudo(pseudoS);
        printf("GetTabPseudo\n");
        for (int i = 0; i< 10; i++){
            printf("%d\n", scoreS[i]);
        }
        return EXIT_SUCCESS;
    }
    getTabScore est la meme fonction que tout a l'heure.
    getTabPseudo agit sur le tableau pseudoS, et pourtant, le tableau scoreS contient un resultat different apres l'execution de la fonction getTabPseudo.

    premier for :

    10000
    9000
    8000
    7000
    6000
    5000
    4000
    3000
    2000
    1000

    deuxième for :

    1606411888
    32767
    1606411888
    32767
    1606411888
    32767
    1606411888
    32767
    1606411888
    32767

    En espérant que vous pourrez m'aider a comprendre ce que j'ai mal fait.

    Super-zen.

  10. #10
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par superzen Voir le message
    Je me retrouve face a un autre problème que je ne comprends pas.

    Voila le code que j’exécute :

    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
    int getTabPseudo(char** pseudo)
    {
        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 == ';'){
                pseudo[cpt] = tampon;
                cpt++;
                actuel = 0;
                memset (tampon, 0, sizeof tampon);
            }
            else if (c == '\n'){
                actuel = 0;
                memset (tampon, 0, sizeof tampon);
            }
            else
                tampon[actuel++] = c;
        }
    }
    En espérant que vous pourrez m'aider a comprendre ce que j'ai mal fait.
    Salut
    En rouge dans le code ce qui ne va pas.
    Explication: En C, une chaine de caractères n'existe pas en tant que telle. On ne peut que les "simuler" par le biais de "tableaux de caractères". Or un "tableau" n'est pas une entité manipulable. On ne peut manipuler que les caractères individuels ou des adresses.
    Or, quand tu écris pseudo[cpt] = tampon, même si on comprend bien ce que tu veux faire (recopier le contenu du tableau "tampon" dans le tableau "pseudo[cpt]"), le C qui ne sait pas manipuler des tableaux se contente de recopier l'adresse du tableau "tampon" dans le tableau "pseudo[cpt]" (rappelle-toi mon post précédent où je disais que le nom brut d'un tableau correspond à l'adresse de son premier élément).

    Or le tableau "tampon" ; bien qu'ayant un contenu variable (chargé individuellement depuis les fgetc() successifs) ; reste un tableau unique donc avec une adresse unique. Et c'est cette adresse et non ce contenu que tu recopies.

    Si tu veux recopier un tableau de caractères dans un autre, il te faut le recopier caractère par caractère. Heureusement, d'autres l'ont fait pour toi et te proposent la fonction "strcmp()" qui fait exactement ce travail...

    Citation Envoyé par superzen Voir le message
    getTabPseudo agit sur le tableau pseudoS, et pourtant, le tableau scoreS contient un resultat different apres l'execution de la fonction getTabPseudo.En espérant que vous pourrez m'aider a comprendre ce que j'ai mal fait.
    En rouge ce qui illustre le cas le plus problématique et le plus dangereux de ce genre d'erreurs: le comportement "indéterminé". Il s'agit d'un comportement qui se produit quand on ne respecte pas les règles du C tout en respectant sa syntaxe. La syntaxe est bonne donc ça compile mais les règles ne sont pas respectées donc ça produit un comportement imprévisible qui peut même aller jusqu'au fonctionnement "apparemment" correct du programme. Ainsi le programme fonctionne jusqu'au jour où on change un minuscule détail anodin et là, ça ne fonctionne plus. Et on se casse alors la tête pour comprendre pourquoi le détail fait planter alors que ce qui fait planter réellement est dans un code plus vieux et souvent alors oublié.

    Donc tu te plantes en remplissant "pseudo" et l'effet visuel se répercute sur le tableau "scores" qui, lui, a pourtant été rempli correctement.

    C'est pour ça qu'en C plus qu'ailleurs, il faut toujours toujours toujours être super rigoureux avec les éléments manipulés...

  11. #11
    Nouveau Candidat au Club
    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
    Points : 1
    Points
    1
    Par défaut
    Ok je vois, il y avait des interferences dans les adresses donc le tableau score n'avait plus le meme contenu.
    Donc l’idée c'est de prendre les caractères un a un et de les mettre dans l'autre tableau.

    Ce code devrait faire l'affaire
    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
    int getTabPseudo(char** pseudo)
    {
        FILE *fichier;
        char tampon[BUFSIZ];
        int actuel = 0, cpt = 0, c;
        fichier = fopen ("/Users/Valentin/Documents/XCodeRepository/souris_f/space_invaders/space_invaders/scores.txt", "r");
        if (!fichier)
            return EXIT_FAILURE;
        while ((c = fgetc (fichier)) != EOF) {
            if (c == ';'){
                pseudo[cpt] = tampon;
                for (int i = 0; i < 3; i++)
                {
                    pseudo[cpt][i] = tampon[i];
                }
                cpt++;
                actuel = 0;
                memset (tampon, 0, sizeof tampon);
            }
            else if (c == '\n'){
                actuel = 0;
                memset (tampon, 0, sizeof tampon);
            }
            else
                tampon[actuel++] = c;
        }
    }
    Mais ce code me retourne une erreur, “EXC_BAD_ACCESS”. Le problème se situe au niveau de "pseudo[cpt][i]", mais pseudo est bien un char**, donc un tableau a deux dimensions, je devrait pouvoir recopier le caractère "tampon[i]" dans "pseudo[cpt][i]".

    EDIT : j'ai remplace "char** pseudo" par "char pseudo[10][3]". Maintenant le code fonctionne, mais je n'arrive pas a m'expliquer pourquoi l'autre écriture ne fonctionne pas.

  12. #12
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par superzen Voir le message
    Ok je vois, il y avait des interferences dans les adresses donc le tableau score n'avait plus le meme contenu.
    Donc l’idée c'est de prendre les caractères un a un et de les mettre dans l'autre tableau.

    Ce code devrait faire l'affaire
    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
    int getTabPseudo(char** pseudo)
    {
        FILE *fichier;
        char tampon[BUFSIZ];
        int actuel = 0, cpt = 0, c;
        fichier = fopen ("/Users/Valentin/Documents/XCodeRepository/souris_f/space_invaders/space_invaders/scores.txt", "r");
        if (!fichier)
            return EXIT_FAILURE;
        while ((c = fgetc (fichier)) != EOF) {
            if (c == ';'){
                pseudo[cpt] = tampon;
                for (int i = 0; i < 3; i++)
                {
                    pseudo[cpt][i] = tampon[i];
                }
                memcpy(pseudo[cpt], tampon, 3);
                cpt++;
                actuel = 0;
                memset (tampon, 0, sizeof tampon);
            }
            else if (c == '\n'){
                actuel = 0;
                memset (tampon, 0, sizeof tampon);
            }
            else
                tampon[actuel++] = c;
        }
    }
    Oui, ta rectification est correcte. Ou alors tu utilises des fonctions déjà toutes faites pour ça comme memcpy (exemple dans ton code)

    Citation Envoyé par superzen Voir le message
    ...mais pseudo est bien un char**, donc un tableau a deux dimensions, je devrait pouvoir recopier le caractère "tampon[i]" dans "pseudo[cpt][i]".

    EDIT : j'ai remplace "char** pseudo" par "char pseudo[10][3]". Maintenant le code fonctionne, mais je n'arrive pas a m'expliquer pourquoi l'autre écriture ne fonctionne pas.
    Arf, parce que les raccourcis ne marchent qu'à condition que le C puisse s'y retrouver !!!

    Essaye d'imaginer un échiquier face aux blancs dans lequel tu numérotes les cases. Ainsi A1 sera case n° 1 et H8 sera case n° 64.
    Comment fais-tu pour trouver le numéro de A2 ? Te suffit de rajouter 8 ce qui donne la case n° 9. Et A3 sera la case n° 17. Et An sera la case n° (n-1) * 8 + 1. Et Bn sera (n-1) * 8 + 2.
    Et pourquoi on ajoute toujours 8 ? Parce qu'un échiquier fait 8 colonnes.

    Il en va de même pour les tableaux à n dimensions. Au final, le C transforme toujours ça en une suite de cases numérotées en fonction des (n-1) dimensions données.
    Or, si tu déclares dans ta fonction un simple pointeur char **tab et que tu demandes tab[x][y], le C ne connaissant pas les dimensions initiales ne peut pas adresser la case mentionnée.

    L'équivalence [] = * ne fonctionne que pour la première dimension d'un tableau. Toutes les autres dimensions doivent toujours être explicitées pour que le C puisse transformer une instruction type case[x][y][z] en instruction de type case[x * nb_max_y + y * nb_max_z + z].

    Donc tu peux déclarer int getTabPseudo(char pseudo[10][3]) ou bien int getTabPseudo(char* pseudo[3]) mais en aucun cas int getTabPseudo(char** pseudo)...

  13. #13
    Nouveau Candidat au Club
    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
    Points : 1
    Points
    1
    Par défaut
    D'accord je comprends mieux. Merci pour toutes ces explications =)

+ 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