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 dimensions


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Deficient visuel
    Inscrit en
    Mai 2019
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Deficient visuel

    Informations forums :
    Inscription : Mai 2019
    Messages : 216
    Par défaut Tableau à 3 dimensions
    Bonjour à toutes et à tous,

    D'abord le code, puis ensuite ma question.
    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
    #include <stdio.h>
     
    int main()
    {
        char pres[4][2][11] = {
            "George", "Washington",
            "John", "Adams",
            "Thomas", "Jefferson",
            "James", "Monroe"
        };
        int loop;
     
        for(loop=0;loop<4;loop++)
            printf("%-6s %-10s\n",pres[loop][0],pres[loop][1]);
     
        return(0);
    }
    Pour l'initialisation de ce tableau, à quoi correspond le dernier nombre entre crochets [11] du tableau pres ?
    Pour le printf, pres[loop][0],pres[loop][1]) se charge respectivement d'afficher quoi ?
    D'avance merci de votre aide

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 769
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 769
    Par défaut
    Tu es sûr que ton code est valide ?

    Parce que le [11] ne permet pas de faire un tableau à 3 dimensions (*), mais de dire que dans ta matrice de 4 lignes - 2 colonnes, tu vas stocker des chaînes d'au plus 11 caractères (char[11])

    Et pour ta deuxième question, c'est du code ultra trivial de parcours d'une matrice : on parcourt chaque ligne (de 0 à 3) et pour chaque ligne, comme on sait qu'on n'a que 2 valeurs ([loop][0] et [loop][1]) on les affiche.



    * : tu as une matrice 4 lignes - 2 colonnes, que tu as 11 fois.
    En C tu peux avoir des tableaux à plusieurs dimensions , mais comme la représentation mémoire est toujours en ligne (un vecteur en somme) cela ne sert à que dalle d'utiliser des tableaux de plus de 2 dimensions (sauf si tu veux te faire un nœud au cerveau )

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par foetus Voir le message
    Tu es sûr que ton code est valide ?
    Il ne l'est pas mais à mon grand étonnement, le compilo rattrappe le coup. Juste un warning mentionnant les accolades manquantes avec -Wall
    Citation Envoyé par chris7522 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char pres[4][2][11] = {
    	"George", "Washington",
    	"John", "Adams",
    	"Thomas", "Jefferson",
    	"James", "Monroe"
    };
    Manque des accolades aux lignes
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char pres[4][2][11] = {
    	{"George", "Washington"},
    	{"John", "Adams"},
    	{"Thomas", "Jefferson"},
    	{"James", "Monroe"},
    };
    Ainsi tu as bien 4 lignes, avec 2 mots par lignes et 11 caractères par mots ce qui répond ainsi à la fois à ton code et à ta première question. Accessoirement définir 11 caractères pour chaque mot alors que (semble-t-il) ces mots sont destinés à être invariants est un peu dommage. Tu définirais 4 lignes avec 2 pointeurs par lignes, pointeurs pointant vers des zones statiques contenant lesdits noms serait plus adéquat. En plus tu pourrais rajouter des pointeurs particuliers permettant de ne plus te limiter à 4
    Code c : 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
    #include <stdio.h>
     
    int main()
    {
    	char *pres[][2] = {
    		{"George", "Washington"},
    		{"John", "Adams"},
    		{"Thomas", "Jefferson"},
    		{"James", "Monroe"},
    		{NULL, NULL},
    	};
    	int loop;
     
    	for(loop=0; pres[loop][0] != NULL; loop++)
    		printf("%-6s %-10s\n",pres[loop][0],pres[loop][1]);
     
    	return(0);
    }
    Ainsi, si tu rajoutes ensuite d'autres présidents, tu n'as pas à modifier ta boucle.
    Par exemple, Grover Cleveland est le seul et unique président des EU a avoir 2 numéros. Il a battu Blaine en 1884 et Harrison en 1892 mais ayant été battu en 1888, il a été alors le 22° et 24° président des EU. Donc tu pourras le mettre 2 fois.

    Citation Envoyé par chris7522 Voir le message
    Pour le printf, pres[loop][0],pres[loop][1]) se charge respectivement d'afficher quoi ?
    Ben ça affiche pres[loop][0] et pres[loop][1] comme c'est écrit
    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]

  4. #4
    Membre confirmé
    Homme Profil pro
    Deficient visuel
    Inscrit en
    Mai 2019
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Deficient visuel

    Informations forums :
    Inscription : Mai 2019
    Messages : 216
    Par défaut
    Bonsoir ,

    Merci a tous les deux d'avoir pris le temps de me repondre .
    J'ai recompilé le code avec gcc et pas de message d'erreur pour moi , c'est curieux tout de meme !

    Merci de vos explications a tous les deux , j'ai bien compris , a part une chose :

    Comme vous me l'expliquez , les deux premier nombres entre crochet indique respectivement le nombre de lignes et de mots par ligne . Ca , j'ai bien compris . Mon tableau est de type char car ce sont des chaines de caracteres mais le dernier crochet [11] lui , indique le nombre maximun de caractere par mot . C'est un entier , il ne devrai pas etre ailleurs du coup ?

  5. #5
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 769
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 769
    Par défaut
    Citation Envoyé par chris7522 Voir le message
    Mon tableau est de type char car ce sont des chaines de caracteres mais le dernier crochet [11] lui , indique le nombre maximun de caractere par mot . C'est un entier , il ne devrai pas etre ailleurs du coup ?
    Non tu te trompes, ton tableau est de type char*

    Pour déclarer une variable X de type "chaîne de caractères de 11 caractères", c'est comme cela char X[12]; (<- Note le +1 pour le caractère final '\0')
    C'est pour cela que je suis assez impressionné que le compilateur ait compris que le 11 est la taille des chaînes et non pas une 3ième dimension, parce que pour moi le stockage risque d'être différent (<- mais à vérifier)

    Après, il faut lire tes cours, ta documentation mais :
    • Le type string n'existe pas en C, et c'est souvent une critique/ une difficulté pour les débutants. C'est un tableau/ pointeur. Et en plus, c'est juste de l'ASCII
    • Lorsque tu codes char X[11] = "Bonjour"; (<- une chaîne de caractères statique que tu ne peux ni modifier ni étendre), la longueur (11) n'a pas besoin d'être spécifiée (donc char X[] = "Bonjour";) parce que le compilateur la calcule et la met à ta place. Donc pas de risque d'erreurs. Et en plus le compilateur ajoute automatiquement le caractère final '\0'.
    • La taille n'est utilisée que par les fonctions dans le même fichier source (peut être unité de compilation avec les include), mais rapidement le compilateur dégrade ta chaîne de caractères en pointeur. C'est pour cela qu'à chaque fois, la taille doit être fournie avec une chaîne de caractères et c'est quasi obligatoire (ou alors on va passer son temps à parcourir sa chaîne jusqu'à la sentinelle '\0' pour les calculs (ou bien appeler la fonction strlen (<- lien cplusplus en anglais)))

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par chris7522 Voir le message
    Mon tableau est de type char
    Non, il est de type char [][][] et ce n'est pas la même chose. On peut (pour essayer de schématiser le truc) dire que "pres" est l'adresse de l'adresse de l'adresse d'un char autrement dit un "char ***" mais c'est vraiment pour faire une analogie très simplifiée car un tableau ce n'est pas un pointeur et si on peut représenter un tableau avec un pointeur, c'est seulement vrai pour les tableaux 1D.

    Citation Envoyé par chris7522 Voir le message
    car ce sont des chaines de caracteres
    Non. Ce sont des tableaux de caractères. Le type "chaine" n'existe pas en C. C'est vrai que les habitués du C peuvent parler parfois de "chaine" mais c'est un abus de langage utilisé pour aller plus vite et qui doit être alors mentalement corrigé quand on veut convertir les paroles en code.

    Citation Envoyé par chris7522 Voir le message
    mais le dernier crochet [11] lui , indique le nombre maximun de caractere par mot
    Non. Il indique le nombre de caractères exact de chaque mot. Parce que même "John" a été stocké dans un char[11]. D'où ma remarque sur le fait que c'était un peu dommage.

    Citation Envoyé par chris7522 Voir le message
    C'est un entier , il ne devrai pas etre ailleurs du coup ?
    Parce que "4" et "2" ne sont pas des entiers ???
    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
    Membre confirmé
    Homme Profil pro
    Deficient visuel
    Inscrit en
    Mai 2019
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Deficient visuel

    Informations forums :
    Inscription : Mai 2019
    Messages : 216
    Par défaut
    Ok bien compris ! Pas toujours évident pour un débutant de comprendre tout ca , l' apprentissage suis son cours , doucement mais surement .
    Encore merci de votre aide
    Bon week-end a tous (sans trop d'excès)

  8. #8
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 769
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 769
    Par défaut
    Citation Envoyé par foetus Voir le message
    C'est pour cela que je suis assez impressionné que le compilateur ait compris que le 11 est la taille des chaînes et non pas une 3ième dimension, parce que pour moi le stockage risque d'être différent (<- mais à vérifier)
    Je me suis trompé. C'est sûrement parce que je n'utilise pas de tableaux de dimension de plus de 2. Et aussi parce que je pense à la représentation mathématiques.

    (Un coup de Google plus tard) en C, les crochets se lisent/ s'interprétent de gauche à droite.

    *) XXX tab[5][7] veut dire qu'on veut 5 ensembles contenant chacun 7 éléments de type XXX.
    *) XXX tab[4][8][9] veut dire qu'on veut 4 ensembles contenant chacun 8 ensembles, ces derniers contenant chacun 9 éléments de type XXX

    Donc char pres[4][2][11] est bien, 4 ensembles contenant chacun un couple (2 ensembles), ces derniers contenant des chaînes de 10 caractères (+ 1 avec le caractère final '\0')

    Et ton oubli des accolades dans ta définition ne dérange pas le compilateur parce que je pense qu'il fait un truc ultra trivial :
    1) Il crée un stockage contigu de la taile qui est la multiplication de toutes les tailles (fournies ou calculées). Dans ton code, taille = 4*2*11 octets
    2) Il prend les éléments 1 par 1 et il les place les 1 à la suite des autres.


    Citation Envoyé par Sve@r Voir le message
    un tableau ce n'est pas un pointeur et si on peut représenter un tableau avec un pointeur, c'est seulement vrai pour les tableaux 1D.
    Si un tableau c'est un pointeur avec un offset.
    La grosse différence, c'est qu'on peut créer un pointeur avec un type incomplet contrairement à un tableau.

    Si tu as XXX array[dim_0][dim_1]...[dim_n] alors la valeur située à la case array[val_0][val_1]...[val_n] correspond à *(array + offset).
    Avec offset = [somme pour X allant de 0 à n-1, de val_X*dim_(X + 1) * ... * dim_n)]+ val_n (<- si je ne me trompe pas)

    Avec ton tableau pres[A][B][ C ] correspond à *(pres + A * 2 * 11 + B * 2 + C).

    Mais ne te prends pas la tête tu peux coder ceci (en mode délire) :

    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
    #include <stdio.h>
     
    #define STR_MAX_LEN 11
    #define STR_NUMBER   3
     
    /* do not forget final %c */
    char* g_STR_FORMAT[STR_NUMBER] = {"%-6s%c", "%-20s%c", "%-2s%c"};
     
     
    int main (int argc, char** argv)
    {
        char* str;
        size_t count;
     
        char tab[][STR_NUMBER][STR_MAX_LEN] = {
            {"George", "Washington", "1"},
            {"John",   "Adams",      "2"},
            {"Thomas", "Jefferson",  "3"},
            {"James",  "Monroe",     "5"},
            {"Grover", "Cleveland",  "2X"},
            {"\0", "\0", "\0"}
        };
     
        str = tab[0][0];
        count = 0;
     
        for(;*(str) != '\0'; str+=STR_MAX_LEN) {
            if (count < (STR_NUMBER - 1)) {
                printf(g_STR_FORMAT[count], str, ' ');
                ++count;
            } else {
                count = 0; /* update count in first */
                printf(g_STR_FORMAT[count], str, '\n');
            }
        }
     
        return 0;
    }

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

Discussions similaires

  1. [Collections] lecture tableau 2 dimensions
    Par heloise dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 30/09/2004, 10h49
  2. [tableau à 2 dimensions] association String et float
    Par LoLoSS dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 12/07/2004, 10h53
  3. Tableau à n dimensions
    Par youb dans le forum MFC
    Réponses: 10
    Dernier message: 13/05/2004, 14h13
  4. Passage d'un tableau à deux dimensions
    Par karl3i dans le forum C
    Réponses: 3
    Dernier message: 20/10/2003, 14h50
  5. Réponses: 23
    Dernier message: 21/08/2003, 07h16

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