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 :

passage de tableau a 2 dimensions


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de LesLemmings
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    302
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 302
    Par défaut passage de tableau a 2 dimensions
    bonjour voila j'ai un tableau
    que je veux passer en parametre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	int tab_A[n][m] ;
     
    	remplire (tab_A, &n, &m) ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void remplire (int** tab,int* colonne, int* ligne)
    {
    ...
    }
    je voudrais passer par pointeur et je n'y arrive pas
    merci de votre aide

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 309
    Par défaut
    Un tableau à deux dimensions ce n'est pas un pointeur de pointeur !
    Si tu veux faire un tableau à deux dimensions il faut passer en paramètre le tableau en question, et tu dois donner la taille des dimensions en plus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void fonction(int tab[][20]...

  3. #3
    Membre éclairé Avatar de LesLemmings
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    302
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 302
    Par défaut
    oui mais
    Code :
    void fonction(int tab[][20]...
    tu presise 20 moi je passe un valeur variable m
    alors comment je peut faire

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 309
    Par défaut
    Déjà les valeurs que tu mets entre les crochets lors de la déclaraiton du tableau DOIVENT IMPÉRATIVEMENT être des CONSTANTES, tu ne peux pas créer de tableau à dimension variable en C normal, et ça m'étonnerait que tu connaisses le C99.

    Si m et n sont des variables inconnues avant la compilation et que justement elles peuvent varier, alors arrête tout de suite, tu dois utiliser l'allocation dynamique.

  5. #5
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par PsychoH13 Voir le message
    Si m et n sont des variables inconnues avant la compilation et que justement elles peuvent varier, alors arrête tout de suite, tu dois utiliser l'allocation dynamique.
    et dans ce cas, le T** a un sens...

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 14
    Par défaut
    Citation Envoyé par PsychoH13 Voir le message
    Un tableau à deux dimensions ce n'est pas un pointeur de pointeur !
    Je suis désolé mais sa fonctionne très bien comment il a fait (sauf que c'est des constantes qu'ils fallaient mettre)

    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
     
    void          fonction()
    {
      char       tab[42][42];
     
      fonc_rempli_tab(tab);
      return;
    }
     
    void         fonc_rempli_tab(char **tab)
    {
      int         i = 0;
      int         u = 0;
     
      while (i != 42)
        {
           while (u != 42)
             {
                tab[i][u] = 42;
                u++;
              }
           u = 0;
           i++;
        }
      return;
    }
    "char **tab" fonctionne tout aussi bien que "char tab[][]" car c'est des pointeurs sur pointeurs !! Le 1er pointe sur une dimention et le 2nd pointe un char de la dimention.

    Si tu fais "**tab = 42" sa reviendra au même que "tab[0][0] = 42"

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Damax Voir le message
    Je suis désolé mais sa fonctionne très bien comment il a fait (sauf que c'est des constantes qu'ils fallaient mettre)
    Quand on cherche à prouver quelque chose, on évite de poster n'importe 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
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c:3: warning: function declaration isn't a prototype
    main.c: In function `fonction':
    main.c:6: warning: implicit declaration of function `fonc_rempli_tab'
    main.c: At top level:
    main.c:11: error: conflicting types for 'fonc_rempli_tab'
    main.c:6: error: previous implicit declaration of 'fonc_rempli_tab' was here
    Process terminated with status 1 (0 minutes, 0 seconds)
    2 errors, 2 warnings
    Ceci
    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
     
    void fonc_rempli_tab (char **tab)
    {
       int i = 0;
       int u = 0;
     
       while (i != 42)
       {
          while (u != 42)
          {
             tab[i][u] = 42;
             u++;
          }
          u = 0;
          i++;
       }
       return;
    }
     
    void fonction (void)
    {
       char tab[42][42];
     
       fonc_rempli_tab (tab);
       return;
    }
     
    int main (void)
    {
       fonction ();
       return 0;
    }
    donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c: In function `fonction':
    main.c:23: warning: passing arg 1 of `fonc_rempli_tab' from incompatible pointer type
    Linking console executable: console.exe
    Process terminated with status 0 (0 minutes, 0 seconds)
    0 errors, 1 warnings
    Le comportement est indéfini.

    http://delahaye.emmanuel.free.fr/images/crash.png

    Merci d'éviter de nous faire perdre notre temps en racontant n'importe quoi. Les bonnes réponses ont déjà été données. Si tu ne connais pas le C, c'est pas grave. Ecoute et apprends.

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 309
    Par défaut
    Citation Envoyé par Damax Voir le message
    Je suis désolé mais sa fonctionne très bien comment il a fait (sauf que c'est des constantes qu'ils fallaient mettre)
    C'est vrai que ça maaaaaaaaaaaaarche super bien... Même avec la suppressions de la majorité des warnings indiqués par Emmanuel, ça te fait un magnifique Bus error...

  9. #9
    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 Damax Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void          fonction()
    {
      char       tab[42][42];
      fonc_rempli_tab(tab);
      return;
    }
    void         fonc_rempli_tab(char **tab)
    ...
    "char **tab" fonctionne tout aussi bien que "char tab[][]" car c'est des pointeurs sur pointeurs !! Le 1er pointe sur une dimention et le 2nd pointe un char de la dimention.:
    C'est tout à fait inexact. Dans char tab[42][42], il ny a aucun objet pointeur . tab est un tableau de tableaux de char, tab[] est un tableau de char et tab[][] un char. Le paramètre correspondant dans la fonction est char (*tab)[42] ou son équivalent char tab[][42]

    Le paramètre char ** tab est un pointeur sur un pointeur sur char ou un pointeur sur un tableau de pointeur sur char. Il correspondrait à un argument du type char * tab[]
    Si tu fais "**tab = 42" sa reviendra au même que "tab[0][0] = 42" :mouarf
    Non, le premier est incorrect et a toutes les chances de faire planter un jour ou l'autre le programme.

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 14
    Par défaut
    même si ça me fait passer pour un con, je suis quand même content d'avoir fait ce post ça m'aura au moins apprit qu'un tableau à une dimention on peut l'utilisé comme un pointeur alors qu'une dimention 2 et plus ça fourrait

    désolé pour les conneries, j'essairai de compilé avant de poster

  11. #11
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Damax Voir le message
    même si ça me fait passer pour un con, je suis quand même content d'avoir fait ce post ça m'aura au moins apprit qu'un tableau à une dimention on peut l'utilisé comme un pointeur alors qu'une dimention 2 et plus ça fourrait

    désolé pour les conneries, j'essairai de compilé avant de poster
    * Positive attitude detected. *

  12. #12
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par LesLemmings Voir le message
    bonjour voila j'ai un tableau
    que je veux passer en parametre
    http://emmanuel-delahaye.developpez.....htm#param_tab

Discussions similaires

  1. Réponses: 6
    Dernier message: 04/05/2010, 05h46
  2. Réponses: 4
    Dernier message: 19/12/2006, 20h06
  3. Passage de tableau à deux dimensions dans une session
    Par keumlebarbare dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 28/11/2006, 18h42
  4. Réponses: 13
    Dernier message: 13/10/2005, 16h03
  5. passage de tableau 2D a une fonction
    Par watashinoitadakimasu dans le forum C
    Réponses: 2
    Dernier message: 11/09/2003, 02h33

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