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 :

pointeur d'un tableau a 2 dimension


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 422
    Par défaut pointeur d'un tableau a 2 dimension
    Hello.

    j'ai un pb :

    je voudrai simplement passer un int tab[81][9] a une fonction de remplissage : remplir(int* t[81][9])

    je l'appel de la sorte : remplir(&tab);

    Et apparement c pas bon!

    Pourriez vous me donner la syntaxe exact?

    Merci d'avance.

  2. #2
    Membre actif Avatar de larnicebafteur
    Inscrit en
    Mai 2006
    Messages
    133
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 133
    Par défaut
    On ne peut pas le faire sous cette forme, car un tableau à 2 dimensions n'est qu'une représentation d'une zone mémoire (de 82*10 elements dans cet exemple).
    Il faut donc passer l'adresse du tableau, ainsi que les 2 dimensions pour pouvoir l'utiliser dans la fonction. Quelquechose dans le genre :

    Fonction : remplir(int* t,int dim1, int dim2)

    Appel de la fonction : remplir(&tab,81,9);

  3. #3
    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 larnicebafteur
    On ne peut pas le faire sous cette forme, car un <snip délire...>
    Tu dis des bêtises...

    http://emmanuel-delahaye.developpez.....htm#param_tab

  4. #4
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Citation Envoyé par benthebest
    Hello.

    j'ai un pb :

    je voudrai simplement passer un int tab[81][9] a une fonction de remplissage : remplir(int* t[81][9])

    je l'appel de la sorte : remplir(&tab);

    Et apparement c pas bon!

    Pourriez vous me donner la syntaxe exact?

    Merci d'avance.
    Essaye de déclarer ta fonction comme ceci :
    Et tu l'appelle :

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Par défaut
    On peut aussi déclarer un tableau comme membre (unique) d'une structure et passer cette structure par référence.

  6. #6
    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 NicolasG
    On peut aussi déclarer un tableau comme membre (unique) d'une structure et passer cette structure par référence.
    Pas de 'passage par référence' en C. Par valeur uniquement. Les passages d'adresses sont explicites en C (via un opérateur & et un paramètres pointeur)

  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 benthebest
    je voudrai simplement passer un int tab[81][9] a une fonction de remplissage : remplir(int* t[81][9])
    http://emmanuel-delahaye.developpez.....htm#param_tab
    ou
    Mais il vaut mieux aussi passer les dimensions, tu en auras probablement besoin dans la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    remplir(int t[][9], size_t x, size_t y)
    Appel :
    EDIT : suppression des * en trop. (Merci crocodilex)

  8. #8
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    http://emmanuel-delahaye.developpez.....htm#param_tab
    ou
    Mais il vaut mieux aussi passer les dimensions, tu en auras probablement besoin dans la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    remplir(int* t[][9], size_t x, size_t y)
    Appel :
    La solution que je propose est fausse alors ?

  9. #9
    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 crocodilex
    La solution que je propose est fausse alors ?
    Non, c'est moi qui ais oublié de corriger... Maudit Copié/Collé...

  10. #10
    Membre éclairé Avatar de miron
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    479
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 479
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Si on utilise ceci comment on appelle la fonction?

  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 miron
    Si on utilise ceci comment on appelle la fonction?
    Déjà répondu. Il faut lire les messages en entiers...

  12. #12
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Mais il vaut mieux aussi passer les dimensions, tu en auras probablement besoin dans la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    remplir(int t[][9], size_t x, size_t y)
    Appel :
    La dernière dimension (ici 9) n'a pas besoin d'être passée en paramètre puisqu'elle est imposée par le compilateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    remplir(int t[][9], size_t x)
    Appel :
    Attention, la dimension supérieure n'est jamais vérifiée par le compilateur.
    Il est trompeur d'écrire même si c'est parfaitement valide.
    La dimension 81 n'est pas validée à la compilation et on peut très bien passer un tableau de dimension inférieure ([80][9] par exemple) qui conduira à un débordement à l'exécution.

  13. #13
    Membre éclairé Avatar de miron
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    479
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 479
    Par défaut
    Citation Envoyé par NicolasG
    Attention, la dimension supérieure n'est jamais vérifiée par le compilateur.
    Il est trompeur d'écrire même si c'est parfaitement valide.
    La dimension 81 n'est pas validée à la compilation et on peut très bien passer un tableau de dimension inférieure ([80][9] par exemple) qui conduira à un débordement à l'exécution.
    Mais ceci ne passe pas que l@de t[81][9]?
    Cela passe tout le tableau?
    Et pour eviter l'erreur marqué ensuite il faut faire quoi?

  14. #14
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Par défaut
    Citation Envoyé par miron
    Mais ceci ne passe pas que l@de t[81][9]?
    Cela passe tout le tableau?
    Et pour eviter l'erreur marqué ensuite il faut faire quoi?
    Un tableau est un pointeur.
    Les tableaux ne sont donc jamais copiés lors d'un passage en tant que paramètre (sauf éventuellement en tant que membre d'une structure mais c'est un autre sujet).

    En C, il n'y a pas de vérification de dépassement d'indice des tableaux.
    C'est au développeur de faire attention.

  15. #15
    Membre éclairé Avatar de miron
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    479
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 479
    Par défaut
    Citation Envoyé par NicolasG
    Un tableau est un pointeur.
    Les tableaux ne sont donc jamais copiés lors d'un passage en tant que paramètre (sauf éventuellement en tant que membre d'une structure mais c'est un autre sujet).

    En C, il n'y a pas de vérification de dépassement d'indice des tableaux.
    C'est au développeur de faire attention.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ma_fonction(&Nom_voiture[20])
     
    void ma_fonction(char*Nom_voiture[])
    Esce que cela est un code bon?
    Ainsi que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ma_fonction(&voiture_aff[15][11])
     
    void ma_fonction(char*voiture_aff[][])

  16. #16
    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 NicolasG
    Un tableau est un pointeur.
    Euh, spécial comme pointeur. Il n'a pas la taille habituelle d'un pointeur et il n'est pas modifiable...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
       int a[3];
       int b[3];
       int *p;
     
       a =  b; /* ne compile pas */  
       sizeof p != sizeof a

  17. #17
    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 miron
    Mais ceci ne passe pas que l@de t[81][9]?
    Non. Ca passe l'adresse de t[0][0].

    http://emmanuel-delahaye.developpez.....htm#param_tab

Discussions similaires

  1. Problème pointeur dans un tableau à deux dimensions.
    Par Hunken dans le forum Débuter
    Réponses: 2
    Dernier message: 12/03/2015, 11h32
  2. pointeur pour un tableau 2d
    Par olive14 dans le forum C
    Réponses: 6
    Dernier message: 07/05/2005, 15h02
  3. [Tableau]comment connaitre la taille d'un tableau à 2 dimensions
    Par Kyti dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 22/04/2005, 10h27
  4. Références et pointeurs sur un tableau
    Par smag dans le forum C++
    Réponses: 2
    Dernier message: 01/03/2005, 20h29
  5. Pointeur vers un tableau
    Par Nikos dans le forum C
    Réponses: 3
    Dernier message: 09/12/2002, 00h43

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