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 :

tableau à 3 dimentions


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut tableau à 3 dimentions
    bonjour j'aimerai travailler avec un tableau à 3 dimentions pour des chaines de caractères et je rencontre quelques problèmes:

    le but c'est de rentrer le pseudo des joueurs en fonction de l'équipe sachant qu'il y a 4 équipes et 3 joueurs par équipes (=> 12 joueurs)

    pour l'initialisation je pense qu'il n'y a pas de problèmes:
    char tableau[4][3][15];
    le pseudo du joueur fera 15 caractères maximum
    a partir de là ça pose problème: j'aimerai récupérer une chaine de caractère (a priori avec scanf) et la mettre dans le tableau

    imaginons que je veuille le joueur 1 qui fera partie de l'équipe 1, j'ai essayé ça mais ça ne marche pas, auriez vous une solution ?
    scanf("%s", tableau[0][0]);
    codeblocks me mets : subscripted value is neither array nor pointer

    j'utilise windows vista avec codeblocks en langage C

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Peux-tu poster un exemple "compilable" qui reproduit le problème?
    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
    Invité
    Invité(e)
    Par défaut
    Voila un code compilable, pour voir le problème. Il y a 2 lignes en commentaire. Retirez les 2 slash devant pour que ça plante^^. Ici mon tableau à 3D s'appelle 'equipes'.
    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
    #include <stdio.h>
    #include <stdlib.h>
    void configurer(char *equipes);
    int main()
    {
        char equipes[4][3][15];
     
        configurer(equipes);
     
        system("pause");
        return 0;
    }
    void configurer(char *equipes){
        int nbJoueurs=0,nbEquipes=0;
        int i=0,j=0,verif=0;
        char tab[4]={0};
     
        do{
        printf("\nEntrez le nombre de joueurs (Max 12): ");
        scanf("%d", &nbJoueurs);
        }while(nbJoueurs<1||nbJoueurs>12);
     
        if(nbJoueurs>=4){  // si nbJoueurs<4 il n'y a pas besoin d'équipes
            printf("\nDes equipes sont necessaires");
            do{              //la boucle sert à vérifier que les équipes sont conforme
            for(i=0;i<3;i++) //je réinitialise le tableau pck si la boucle se répète les
                tab[i]=0;      //valeurs seront différentes
            printf("\nEntrez le nombre d'equipes (min 2, max 4) : ");
            scanf("%d", &nbEquipes);
            system("cls");
            for(i=0;i<nbJoueurs;j=0){
                for(j=0; j<nbEquipes && i<nbJoueurs ;j++,i++){
    //le but de ces 2 boucles est de dire à l'utilisateur quel joueur appartient à //quel équipe
                    tab[j]++;  //compte combien de joueurs appartiennent à l'équipe
                    printf("\nle joueur %d fera parti de l'equipe %d", i+1,j+1);
                    if(tab[j]>3) //il y a max 3 joueurs par équipes donc s'il y en a plus
                        verif=1; // il faut recommencer la boucle
                    else
                        verif=0;
                }}
           if(tab[j]>3) //avertir le joueur si le pb vient du nb de joueurs par équipes
                printf("\nil y a plus de 3 joueurs dans une equipe");
            }while((nbEquipes<2)||(nbEquipes>4)||verif==1);
            printf("\n\n");
            for(i=0;i<nbEquipes;i++) //afficher le nb de joueurs par équipes
                printf("il y a %d joueurs dans l'%cquipe %d\n", tab[i],130, i+1);
    // enfin on peux demander le pseudo d'un joueur pour tester:
            //printf("\npseudo du joueur 1: "); //qui fait partie de l'équipe 1
         //scanf("%s", equipes[0][0]); //joueur1=ligne0  équipe1=ligne0 du tableau
    //pour que le programme compile il faut mettre ces 2 lignes en commentaires
     
        }//fin de la boucle 'si nbJoueurs>=4'
    }// fin de la fonction 'configurer'
    Je suis désolé pour la clarté du programme, c'est un peu brouillon. J'espère que vous comprendrez.
    Dernière modification par Melem ; 22/03/2010 à 01h27.

  4. #4
    Membre éclairé Avatar de mikhailo
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    78
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 78
    Par défaut
    Yop,

    Je suis moi-même un peu novice, mais je me permets de te dire une ou deux choses =)

    Premièrement, c'est pas cool de manipuler des données numériques; je pense qu'il est mieux de déclarer dans ce cas des variables par #define comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #define TAILLE_MAX_NOM 15
    #define NB_EQUIPES 4
    #define NB_JOUEURS_PAR_EQUIPE 3
    Comme ça si tu veux modifier ton programme plus tard, tu n'auras pas à chercher dans ton code à quoi correspond le 3 ou le 4, est-ce que ton for va jusqu'à 4 parce que c'est le nombre d'équipes ou parce que c'est le nombre de joueurs par équipe +1, etc etc.




    Ensuite, tes erreurs de compilation:
    [mikhailo@k5 Desktop]$ gcc -Wall -ansi -ggdb3 -o prog.o prog.c
    prog.c: In function main:
    prog.c:8: attention : passing argument 1 of configurer from incompatible pointer type
    prog.c: In function configurer:
    prog.c:49: erreur: la valeur indicee n'est ni un tableau ni un pointeur


    prog.c:8: attention : passing argument 1 of configurer from incompatible pointer type
    Ca, ça veut dire que tu as défini ta fonction "configurer" de façon à prendre en argument quelque chose, et ensuite quand tu appelles ta fonction, tu lui donnes à manger autre chose. Genre, tu crées un animal qui mange de la paille, et ensuite tu essaies de le nourrir avec des copeaux de fer. Ca peut marcher, ou ça peut ne pas marcher, d'où l'erreur:
    Tu déclares ta fonction "configurer":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void configurer(char *equipes);
    Donc elle s'attend à recevoir en argument un pointeur désignant une chaine de caractères.
    Or:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        char equipes[4][3][15];
     
        configurer(equipes);
    tu lui donnes un tableau à trois dimensions... forcément, elle gueule.



    prog.c: In function configurer:
    prog.c:49: erreur: la valeur indicee n'est ni un tableau ni un pointeur

    Cette erreur là était aussi induite par la fausse déclaration de "equipes" et de la fonction "configurer": configurer() s'attendait à avoir en argument un char*, or tu lui demandes d'utiliser son argument comme si c'était un char***... donc erreur, encore une fois.




    Je t'ai mis un patching de ton code; en réglant les deux problèmes ci-dessus. Ca compile, mais j'imagine que tu n'as pas encore fini ton programme, car notamment, je n'ai vu aucun endroit où tu remplissais effectivement ton tableau "equipes". Et aussi, comme je ne savais pas trop, j'ai juste mis les #define et les ai utilisés pour la déclaration du tableau "equipes", donc si tu décides de les utiliser, il faut que tu regardes où dans ton code quelle valeur correspond à quoi.







    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    #include <stdio.h>
    #include <stdlib.h>
     
    #define TAILLE_MAX_NOM 15
    #define NB_EQUIPES 4
    #define NB_JOUEURS_PAR_EQUIPE 3
     
     
     
     
     
     
    void configurer(char*** equipes);
     
     
     
     
    int main()
    {
        char*** equipes;
    	equipes = malloc(NB_EQUIPES * NB_JOUEURS_PAR_EQUIPE * TAILLE_MAX_NOM * sizeof(char));
     
        configurer(equipes);
     
        system("pause");
    	free(equipes);
        return 0;
    }
     
     
     
     
     
     
    void configurer(char*** equipes){
        int nbJoueurs=0,nbEquipes=0;
        int i=0,j=0,verif=0;
        char tab[4]={0};
     
        do{
        printf("\nEntrez le nombre de joueurs (Max 12): ");
        scanf("%d", &nbJoueurs);
        }while(nbJoueurs<1||nbJoueurs>12);
     
        if(nbJoueurs>=4){  
            printf("\nDes equipes sont necessaires");
            do{              
            for(i=0;i<3;i++) 
                tab[i]=0;      
            printf("\nEntrez le nombre d'equipes (min 2, max 4) : ");
            scanf("%d", &nbEquipes);
            system("cls");
            for(i=0;i<nbJoueurs;j=0){
                for(j=0; j<nbEquipes && i<nbJoueurs ;j++,i++){
     
                    tab[j]++;  
                    printf("\nle joueur %d fera parti de l'equipe %d", i+1,j+1);
                    if(tab[j]>3) 
                        verif=1; 
                    else
                        verif=0;
                }}
           if(tab[j]>3)
                printf("\nil y a plus de 3 joueurs dans une equipe");
            }while((nbEquipes<2)||(nbEquipes>4)||verif==1);
            printf("\n\n");
            for(i=0;i<nbEquipes;i++)
                printf("il y a %d joueurs dans l'%cquipe %d\n", tab[i],130, i+1);
     
            printf("\npseudo du joueur 1: ");
         scanf("%s", equipes[0][0]);
     
     
        }
    }

  5. #5
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Effectivement, le problème se situe sur le premier argument de configurer().

    La solution proposée par mikhailo est erronnée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        char*** equipes;
    	equipes = malloc(NB_EQUIPES * NB_JOUEURS_PAR_EQUIPE * TAILLE_MAX_NOM * sizeof(char));
    Ici, equipes n'est pas un char ***, mais un char *. Le déclarer en char *** pour se conformer au prototype de configurer() conduira à des erreurs à l'exécution dans la fonction (calcul faux des adresses des éléments du tableau).

    On veut passer un tableau en paramètre de la fonction. Comme toujours, on passe l'adresse du premier élément du tableau.
    Dans char equipes[4][3][15] , equipes est un tableau de 4 éléments char [3][15]. On doit donc passer l'adresse d'un tableau char[3][15] : char (*)[3][15] (spécifier 3 et 15 est obligatoire ainsi que les parenthèses autour de *)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void configurer(char (*equipes)[3][15]) ;
    int main()
    {
        char equipes[4][3][15];
        configurer(equipes);
    ....
        return 0;
    }
    void configurer(char (*equipes)[3][15]){
    ...
      scanf("s", equipes[0][0]);
    ....

  6. #6
    Invité
    Invité(e)
    Par défaut
    effectivement mikhailo ton code plante et il manque une accolade à diogene sinon ça marche. Effectivement mon intention était d'utiliser un malloc pour éviter de gacher de la mémoire, dans ce cas comment faire et est-ce que quelqu'un pourrais m'expliquer quelle est l'utilité de mettre plusieurs * à la suite ? avant de creer ce sujet j'ai fait des recherches sur internet et je voyais souvent des codes où il y en avais 2 ou 3
    merci

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

Discussions similaires

  1. [WD15] Passage en paramètre d'un tableau à 2 dimentions
    Par Laurent_m_paris dans le forum WinDev
    Réponses: 5
    Dernier message: 15/09/2010, 16h49
  2. tableau a dimention variable
    Par dionisos56 dans le forum C++
    Réponses: 7
    Dernier message: 25/11/2007, 13h40
  3. [Prototype] Tableau à deux dimentions
    Par CrazySeb dans le forum Bibliothèques & Frameworks
    Réponses: 1
    Dernier message: 04/07/2007, 11h04
  4. tableau deux dimentions
    Par tinobimbo dans le forum Flash
    Réponses: 2
    Dernier message: 18/07/2006, 13h12
  5. Tableau 2 dimentions, pointeur
    Par DidierMesenbourg dans le forum C
    Réponses: 4
    Dernier message: 22/02/2005, 08h08

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