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 à deux dimensions


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2
    Par défaut Tableau à deux dimensions
    Bonjour

    J'aurais une autre question à propos des tableaux à deux dimensions.

    j'ai crée un tableau comme précédemment :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int** tableau_p = malloc(sizeof(int*) * 2 );
    int i;
    for(i=0;i<2;i++)
       tableau_p[i] = malloc(sizeof(int) * 3);
     
    tableau_p[0][0] = 200;
    tableau_p[0][1] = 150;
    tableau_p[0][2] = 100;
    tableau_p[1][0] = 50;
    tableau_p[1][1] = 45;
    tableau_p[1][2] = 40;
    J'ai deux fonctions auxquelles je veux passer ce tableau pour l'afficher :
    La 1ere qui marche sans problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void fct_3(int **tab,int l, int c){
     
       int i,j;
       for(i=0;i<l;i++){
          for(j=0;j<c;j++)
             printf("%d ",tab[i][j]);
       }
       printf("\n");
    }
    Que j'appelle par fct_3(tableau_p,2,3)

    Jusqu'ici tout marche mais j'ai ensuite voulu passer ce tableau d'une manière différente :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void fct(int l,int c,int (*tab)[c]){
     
       int i,j;
       for(i=0;i<l;i++){
          for(j=0;j<c;j++)
             printf("%d ",tab[i][j]);
       }
       printf("\n");
    }
    }
    Cette fois-ci j'utilise ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int (*p)[3] = *tableau_p; //Vu dans la FAQ
    fct(2,3, p);
    mais j'obtiens le code le Warning pour la ligne int (*p)[3] = *tableau_p; :
    warning: initialization from incompatible pointer type.

    A l'exécution j'obtiens cependant :
    200 150 100 17 50 45
    au lieu de
    200 150 100 50 45 40.

    Pouvez-vous me dire d'où viennent les erreurs (le Warning et le mauvais affichage) ?
    La 1ere manière de passer un tel tableau est-elle la seule solution valable?

    Cordialement.

  2. #2
    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
    La fonction void fct(int l,int c,int (*tab)[c]) suppose que tab soit un tableau de tableaux de c int, donc que les données soit arrangées ainsi (pour c= 3) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
           <    tab[0]    ><     tab[1]     >     
           ---------------------------------
          | 200| 150 | 100|  50 |  45 |  40 |
           ---------------------------------
    Ce n'est pas l'organisation en mémoire des tableaux que tu as créés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                      int *           int
         int **      ----       ---------------
       tableau_p -> | p1-|---> | 200| 150 | 100|
                    ----       ---------------
                    | p2-|---> | 50 |  45 |  40|
                     ----       ---------------
    Le tableau {200, 150,100} et le tableau {50, 45, 40} n'ont aucune raison d'être contigüs.

    A l'exécution j'obtiens cependant :
    200 150 100 17 50 45
    D'après ce que tu obtiens, il est possible qu'on ait (par hasard) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            p1                     p2
           ---------------------------------------
          | 200| 150 | 100|  17 |  50 |  45 |  40 |
           ---------------------------------------
    mais j'obtiens le code le Warning pour la ligne int (*p)[3] = *tableau_p; :
    warning: initialization from incompatible pointer type.
    * tableau_p est un int* ,"adresse d'entier", alors que p est "adresse d'un tableau de 3 entiers". les deux types d'adresse sont différents

  3. #3
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2
    Par défaut
    Merci Beaucoup !

    J'avais complétement zappé que l'incrémentation d'un pointeur se fait en fonction du type.
    pour int (*p)[3] :
    -J'obtiens les bonnes valeurs pour les 3 premières car elles correspondent à p[0][i].
    -Mais p[1] me renvoie 3 *sizeof(int) plus loin, d'où le 17 car {200, 150,100} {50, 45, 40} ne sont pas contigüs (pour tableau_p).

Discussions similaires

  1. [Tableaux] tri de tableau deux dimensions
    Par oursquetaire dans le forum Langage
    Réponses: 8
    Dernier message: 27/12/2005, 14h27
  2. Affichage d'un tableau à deux dimensions.
    Par Allan dans le forum C
    Réponses: 3
    Dernier message: 11/12/2005, 18h29
  3. Réponses: 1
    Dernier message: 18/11/2005, 11h38
  4. tri alphabétique dans un tableau deux dimensions
    Par *!!cocco!!* dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 06/12/2004, 21h38
  5. Passage d'un tableau à deux dimensions
    Par karl3i dans le forum C
    Réponses: 3
    Dernier message: 20/10/2003, 14h50

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