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 mono et multidimension


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Inscrit en
    Mai 2009
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 49
    Par défaut tableaux mono et multidimension
    Bonsoir tout le monde ,
    J'ai des pbs avec les tableaux;
    en fait, maintenant c une question: est ce que, sémantiquement parlant, un tableau 2D , par ex tab[N][N], est équivalent à toto[N*N]; bien sur en prenant les changement d'indices.

    Je veux savoir si on peut se passer de la syntaxe tab[N][N], et travailler avec
    le monodimentionnel; ou bien il existe des cas où il faut passer par les [][].

  2. #2
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut
    Salut.

    Citation Envoyé par lazakal Voir le message
    tableau 2D , par ex tab[N][N], est équivalent à toto[N*N]; bien sur en prenant les changement d'indices.
    Non tab[N][N] est un tableau bidimensionnel de dimensions N et N (par analogie, c'est comme si tu avais un tableau de N lignes composées chacune de N cases) alors que tab [N*N] est un tableau mono dimensionnel de dimension N*N (cette fois, N*N cases sur une seule ligne).

    Citation Envoyé par lazakal Voir le message
    Je veux savoir si on peut se passer de la syntaxe tab[N][N], et travailler avec le monodimentionnel.
    Tout dépend du problème algorithmique posé mais il n'y a pas d'équivalence entre les deux syntaxes (sauf si tu as un tableau de dimensions [1][k] ou [k][1] avec k quelconque bien entendu, là tu pourra te rapporter à un tableau mono dimensionnel de dimension [k], mais bon tu ne tomberas jamais sur un tableau avec de telles dimensions je pense).

    P.S : il peut y avoir une infinité de dimensions possible, algorithmiquement parlant.

    Cordialement,
    Idriss

  3. #3
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Ces deux tableaux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int tab1[N][N];
    int tab2[N*N];
    auront la même représentation en mémoire, mais la syntaxe d'accès est différente.

  4. #4
    Membre actif
    Inscrit en
    Mai 2009
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 49
    Par défaut pointeur et tableau
    Corrigez moi si j'ai bien vu,
    en tapant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
        int *pt;
        int A[5][5];
        pt = A;
        A[0][0] = 1;
        printf("%i", pt[0]);
        return 0;
     
    }
    j'en déduit qu'on se plaçant sur un pointeur que le tab 2D A[][] parait monodimensionnel.
    Car en affichant A[0][0] et A[0] on tombe sur les bizarreries.

  5. #5
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut
    Salut.

    Pour ton code, avec un compilo bien réglé tu aurais ce Warning :
    assignment from incompatible pointer type

    Le comportement de ton pointeur est indéterminé ... il faut lui allouer la mémoire nécessaire dynamiquement. Il semble néanmoins, d'après des tests que pt[k] = A[0][k] (pour k quelconque), mais ce n'est pas propre et ça n'a aucun intérêt sur le plan algorithmique : autant utiliser un tableau à 1D, sans compter que les valeurs stockées dans les cases des lignes suivantes (A[1][k], A[2][k], etc) ne pourrons pas être lues.

    Sinon, tu peut afficher A[0][0] mais il est normal que tu ne puisses pas afficher A[0] ... on vient de t'expliquer en quoi les tableau à 1 dimension et les tableau à deux dimensions sont différents, pourquoi cherches-tu à remplacer l'un par l'autre ?

    Sinon, bon ce n'est pas trop important (mais c'est plus rigoureux), quand main () ne prend pas de paramètres, penses à écrire int main (void).

  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 lazakal Voir le message
    Corrigez moi si j'ai bien vu,
    en tapant:
    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
    int *pt;
    int A[5][5];
    pt = A;
    A[0][0] = 1;
    printf("%i", pt[0]);
    return 0;

    }
    j'en déduit qu'on se plaçant sur un pointeur que le tab 2D A[][] parait monodimensionnel.
    Car en affichant A[0][0] et A[0] on tombe sur les bizarreries.
    En fait, un tableau bidimensionnel sera traduit en mémoire par un simple tableau et c'est normal car la mémoire n'est qu'une suite d'octets.
    Et donc aller sur la case A[x][y] sera traduit, en final, par A[x * largeur_en_y + y]. Et ce mécanisme sera étendu quelles que soient le nombre de dimensions.

    Maintenant, ton code comporte une erreur car pt étant un int *, il ne peut pas recevoir la valeur de A qui se rapproche plutôt d'un int **. Alors c'est vrai qu'il n'y a, à la base, pas grande différence entre un int * ou int ** (tous deux reçoivent une adresse) mais si tu travailles avec un int **, ça veut dire que (*pt) est connu (int*) et (**pt) est lui-aussi connu (int). Alors que si tu utilises "int *pt", le compilo croira que "*pt" est un int alors que c'est pas le cas.

    Toutefois, méfiance. Même si A peut ressembler à un int **, ce n'en est pas tout à fait un. En effet, le compilo connaissant la dimension de A saura faire le calcul qui va bien pour aller sur A[x][y] alors qu'il ne saura pas aller sur pt[x][y].

    Pour simplifier: seule la dernière dimension d'un tableau peut être remplacée par une étoile. Ainsi A[10] peut être stocké sans soucis dans un int *pt (et les accès à A[x] pourront être remplacés par pt[x]) mais un A[10][100] ne pourra être stocké que dans un int *pt[100] et ainsi de suite.
    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 actif
    Inscrit en
    Mai 2009
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 49
    Par défaut pointeur **
    Merci homo-sapiens-numerus (1111..) ; quoique ça parait enchevêtré mais je tiens le bout : **pt n'est pas un int, je vais cherché un "contre ou pour" exemple pour me convaincre.

  8. #8
    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
    Citation Envoyé par Sve@r Voir le message
    ...
    Toutefois, méfiance. Même si A peut ressembler à un int **, ce n'en est pas tout à fait un...
    Ce n'en est pas un du tout. C'est un int (*)[5] : adresse d'un tableau de 5 int (les éléments du tableau A sont des tableaux de 5 int)

    Le code suivant est légal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
       int *pt;
       int A[5][5];
       pt = A[0];
    ....
       return 0;
    }

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

Discussions similaires

  1. [Tableaux] Déclaration tableau multidimension
    Par P4board dans le forum Langage
    Réponses: 2
    Dernier message: 22/10/2007, 21h18
  2. [Tableaux] Recherche dans un tableau multidimension
    Par licorne dans le forum Langage
    Réponses: 2
    Dernier message: 11/10/2006, 15h46
  3. [Tableaux] créer un tableau multidimension
    Par zimotep dans le forum Langage
    Réponses: 2
    Dernier message: 18/03/2006, 17h18
  4. [Tableaux] Pb tri multidimension
    Par licorne dans le forum Langage
    Réponses: 7
    Dernier message: 30/01/2006, 14h37
  5. Réponses: 2
    Dernier message: 08/10/2005, 22h32

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