1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mars 2015
    Messages
    155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mars 2015
    Messages : 155
    Points : 68
    Points
    68

    Par défaut Comment connaitre le nombre de dimensions d'un tableau

    Bonjour

    J'aimerais connaitre à l'avance le nombre de dimension(s) d'un tableau ?
    Y'a t il une fonction native en c ? ou donc faut il la fabriquer et comment car je ne vois pas du tout ?
    J'ai cherché ici partout mais peut-être que je ne la vois pas ou quelle n'existe pas ! https://www.tutorialspoint.com/c_sta...rary/index.htm

    J'avais bien penser à ceci pour commencer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int y,z;
    z	=	sizeof(menu)/(sizeof(int)*(sizeof(menu[0])/sizeof(int)));
    y	=	(sizeof(menu[0])/sizeof(int))/2;
    //valeur de ():
    printf("//valeur de (z):%d\n",z);
    printf("//valeur de (y):%d\n",y);
     
     
    // si y ou z =0 alors y'a rien dans une des dimensions dans un tableau à 2D
    mais c'est un léger pour commencer ! ça me donne la taille des tableaux mais pas le nb de dimension du tableau
    Je n'ai pas la moindre idée !

  2. #2
    Membre émérite
    Inscrit en
    mars 2005
    Messages
    893
    Détails du profil
    Informations forums :
    Inscription : mars 2005
    Messages : 893
    Points : 2 575
    Points
    2 575

    Par défaut

    Je n'ai pas tout saisi mais un tableau à n dimensions est une interprétation. L'adressage mémoire est toujours linéaire, unidimensionnel. L'adresse de chaque octet est un seul nombre dans l'ensemble des entiers naturels, ce n'est pas une paire ni un t-uple.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mars 2015
    Messages
    155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mars 2015
    Messages : 155
    Points : 68
    Points
    68

    Par défaut

    Oui je sais qu'un tableau même à 10 dimensions utilise qu'une seule adresse mémoire

    Et si en pointant sur cette adresse il y aurait peut-être un moyen de connaitre, de retrouver le nombre de dimensions ?

  4. #4
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    juin 2007
    Messages
    4 542
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : juin 2007
    Messages : 4 542
    Points : 14 192
    Points
    14 192

    Par défaut

    Non.
    C'est impossible sans beaucoup d'aide du développeur.
    les chaines de caractères y arrivent un peu en utilisant le caractère nul ('\0'), mais rien n'est prévu dans le langage uniquement.

    un nom de tableau est convertible en pointeur vers son premier élément.
    sizeof d'un tableau retourne la place totale qu'il occupe. A moins que ce soit un argument de fonction, car il est alors remplacé par un pointeur (à la compilation).

    Mais comment peux-tu avoir besoin de connaître la dimension d'un N-tableau? A quel moment as-tu perdu cette information?
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  5. #5
    Membre émérite
    Inscrit en
    mars 2005
    Messages
    893
    Détails du profil
    Informations forums :
    Inscription : mars 2005
    Messages : 893
    Points : 2 575
    Points
    2 575

    Par défaut

    Citation Envoyé par nouilletonne Voir le message
    Oui je sais qu'un tableau même à 10 dimensions utilise qu'une seule adresse mémoire

    Et si en pointant sur cette adresse il y aurait peut-être un moyen de connaitre, de retrouver le nombre de dimensions ?
    Les tableaux multi-dimensionnels sont du sucre syntaxique : une illusion et rien qu'une illusion. Le compilateur génère exactement le même code pour un traitement associé à une variable déclarée int a[2*3]; ou int a[2][3]; . Une fois les calculs d'offsets réalisés, il se défausse de cette information de dimensions. Ce n'est pas la seule : la cardinalité totale de l'ensemble est également perdue (pas de bounds checking à l'exécution, sizeof x est une expression constante).


    Citation Envoyé par ternel Voir le message
    Mais comment peux-tu avoir besoin de connaître la dimension d'un N-tableau? A quel moment as-tu perdu cette information?
    Je seconde cette interrogation : problème XY en vue.

  6. #6
    Membre émérite
    Homme Profil pro
    sans emploi
    Inscrit en
    janvier 2014
    Messages
    511
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : janvier 2014
    Messages : 511
    Points : 2 505
    Points
    2 505

    Par défaut

    Bonjour,

    Quelques remarques :
    • en C il n'y a pas de «tableaux multidimensionnels» car un type tableau n'a jamais qu'une et une seule dimension. Même une écriture comme int foo[5][10] ne déclare foo comme un tableau d'une dimension.
    • ne jamais oublier qu'un tableau n'est pas un pointeur et un pointeur n'est pas un tableau
    • C n'a pas d'outils d'introspections, si tu as besoin d'informations sur un type tout doit être fait à la main pour garder ces informations


    Une question comme celle-ci montre un défaut de conception plus qu'un «manque» en C. Pour paraphraser Ternel, le tout n'est pas de savoir quand tu as perdu cette information mais plutôt si tu as pensé à la garder.

    Edit: super grillé, mais entièrement d'accord avec mes VDD.

  7. #7
    Membre éprouvé Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    mai 2010
    Messages
    285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : mai 2010
    Messages : 285
    Points : 968
    Points
    968

    Par défaut

    Bonjour
    Citation Envoyé par nouilletonne Voir le message
    Oui je sais qu'un tableau même à 10 dimensions utilise qu'une seule adresse mémoire

    Et si en pointant sur cette adresse il y aurait peut-être un moyen de connaitre, de retrouver le nombre de dimensions ?
    Pour connaitre le nombre d'éléments ou la taille de votre tableau vous pouvez procéder de la façon ci-dessous (a compilé & vérifié)
    Attention: le code source peut contenir des erreurs
    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
    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
     
    /*
    *   Constante taille tableau
    */
    #define SIZEA   2
    #define SIZEB   2
    #define SIZEC   2
     
    /*
    *   LibC
    */
    #include <errno.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
     
    int main( void ){
     
        /*
        *   Variable de parcourd
        */
        short i = 0;
        short j = 0;
        short k = 0;
        short l = 0;    //Variable d'incrémentations
     
        /*
        *   Diférents tableaux
        */
        short tab[10] = {0};
        short tab2[2] = {0};
        short tab3[2][2][2];
        short *ptr = NULL;
     
        /*
        *   Determination nombre élements = taille tableau
        *   (différents taille tableaux)
        */
        unsigned short size = sizeof tab / sizeof *tab;
        unsigned short size_A = sizeof tab2/ sizeof *tab2;
        unsigned short size_B = sizeof tab3/ sizeof tab3[0][0][0];
     
        /*
        *   Affichage nombre éléments
        */
        fprintf( stdout, "size tab\t = %d\n", size );
        fprintf( stdout, "size tab2\t = %d\n", size_A );
        fprintf( stdout, "size tab3\t = %d\n", size_B );
     
        /*
        *   Initialisation Tableau
        */
        for( i = 0; i< SIZEA; i++ ){
            for( j = 0; j < SIZEB; j++ ){
                for( k = 0; k < SIZEC; k++ )
                    tab3[i][j][k] = l++;
            }
        }
     
        /*
        *   Affichage & comptage élements
        */
        fprintf( stdout, "Tab3\t\t = ");
        for( i = 0; i< SIZEA; i++ ){
            for( j = 0; j < SIZEB; j++ ){
                for( k = 0; k < SIZEC; k++ )
                    fprintf( stdout, "%d\t", tab3[i][j][k]);
            }
        }
        fprintf( stdout, "\n");
     
        /*
        *   Allocation mémoire ptr
        */
        errno = 0;
        if( NULL == (ptr = malloc( size_B * sizeof(short) ) ) ){
            fprintf( stderr, "(%d)\t:%s\n\t:%s\n", errno,
                "Erreur allocation mémoire", strerror(errno) );
            return (EXIT_FAILURE);
        }
     
        /*
        *   initialisation
        */
        memset( ptr, 0, size_B );
        for( i = 0; i < size_B; i++ )
            *(ptr+i) = i;
     
        /*
        *   Affichage élements ptr
        */
        fprintf(stdout, "Ptr\t\t = " );
        for( i = 0; i < size_B; i++ )
            fprintf( stdout, "%d\t", *(ptr+i) );
        fprintf( stdout, "\n" );
     
        /*
        *   Free mémoire ptr
        */
        free( ptr );
        ptr = NULL;
        return (EXIT_SUCCESS);
    }

    à bientôt
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    5 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    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 : 5 593
    Points : 15 099
    Points
    15 099
    Billets dans le blog
    1

    Par défaut

    Citation Envoyé par nouilletonne Voir le message
    J'ai cherché ici partout mais peut-être que je ne la vois pas ou quelle n'existe pas !
    Bonjour

    Comme disaient les shadocks, s'il n'y a pas de solution c'est qu'il n'y a pas de problème.

    Mais bon, ici précisément la plaisanterie rejoint la réalité car (et je vais redire ce que tous t'ont déjà dit), si l'outil n'existe pas c'est qu'il n'a pas de raison d'être. Et s'il n'a pas de raison d'être, c'est déjà parce qu'effectivement un tableau même à x dimensions n'est en final qu'une longue suite d'octets (donc toujours en une dimension au niveau mémoire) mais surtout parce que tu n'as aucune raison de ne pas connaitre les dimensions des tableaux que tu crées.

    Et si d'aventure le tableau t'est fourni par une librairie qui n'est pas à toi (je dis ça mais j'ai pas d'exemple en tête de librairie fournissant des tableaux xD et ça m'étonnerait même que ça existe...) ben tu auras fatalement quelque part une doc ou au pire un ".h" te donnant les dimensions en questions...
    Et en fait, à bien y réfléchir, si je devais écrire un outil fournissant un tableau xD à un client, alors j'encapsulerais ce tableau dans une structure contenant donc le tableau lui-même plus des infos diverses sur le tableau dont, entre autre, ses dimensions. Donc bref a aucun moment tu n'es sensé ignorer les dimensions des tableaux que tu manipules...
    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

Discussions similaires

  1. Réponses: 31
    Dernier message: 30/09/2006, 22h08
  2. Réponses: 2
    Dernier message: 13/06/2006, 15h46
  3. comment connaitre le nombre de <tr> au sein d'un <table>
    Par pit9.76 dans le forum JavaScript
    Réponses: 2
    Dernier message: 09/06/2006, 13h27
  4. Réponses: 2
    Dernier message: 05/05/2006, 08h55
  5. comment connaitre le nombre ...
    Par mythtvtalk.com dans le forum Requêtes
    Réponses: 9
    Dernier message: 04/08/2003, 08h18

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