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 à double entrée en paramêtre


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur systèmes embarqués
    Inscrit en
    Juillet 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur systèmes embarqués
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2006
    Messages : 42
    Par défaut Tableau à double entrée en paramêtre
    Bonour à tous,
    je doit passer un tableau à double entrée (dont la taille peut varier) en parametre dans une fonction.
    J'ai essayer de definir la fonction des facons suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int fonction(char *tableau[])
    int fonction(char **tableau)
    et dans les deux cas ça compile mais ce n'est apparement pas la bonne adresse qui est transmise.
    Le tableau est déclaré dans une autre fonction de la facon suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char tableau[nbx][nby];
    Je contourne actuellement le problème en assignant une taille bidon à mon tableau (c'est à dire int fonction(char tableau[][20]) ), mais mon projet devant être embarqué ca ne pourra pas marcher comme ça.
    Merci de votre aide

  2. #2
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Quand un tableau est passé en paramètre à une fonction il faut préciser la taille des dimensions autres que la première d'où l'impossibilité de créer une fonction générique qui accepterait en paramètre des tableaux bidimensionnels de taille variable.
    Pour avoir une fonction générique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int fonction(int** t,size_t size);
    soit on alloue le tableau dynamiquement et il faut passer le pointeur "int**" qui a été obtenu après allocation.
    soit si le tableau est statique on passe un tableau de pointeur sur les sous-tableaux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int t[3][3];
    int* t_p[3];
    for(int i=0;i<3;i++){
    t_p[i]=&t[i];
    }
     
    f(t_p,sizeof(t_p));

  3. #3
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Si ton tableau est déclaré sous la forme tab[DIM1][DIM2] alors les "cellules" sont contigues, donc tu peux passer un simple tableau à une dimension int fonction(char tableau[]) et ensuite récupérer les bonnes valeurs en sachant que tab[x][y] == tableau[x*DIM2+y]
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  4. #4
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    ensuite récupérer la bonne adresse en sachant que tab[x][y] == tableau[x*DIM2+y]
    Oui mais:
    (dont la taille peut varier)

  5. #5
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    et alors, il suffit de passer la taille d'une ligne en paramètres de la fonction (je ne l'ai pas écrit effectivement dans mon exemple).
    int fonction(char tableau[], int lenline)
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  6. #6
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Citation Envoyé par Trap D
    et alors, il suffit de passer la taille d'une ligne en paramètres de la fonction (je ne l'ai pas écrit effectivement dans mon exemple).
    int fonction(char tableau[], int lenline)
    Il manque encore le nombre de ligne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int fonction(char tableau[],size_t number_of_line,size_t lenline);

  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 seriousme
    Pour avoir une fonction générique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int fonction(int** t,size_t size);
    soit on alloue le tableau dynamiquement et il faut passer le pointeur "int**" qui a été obtenu après allocation.
    soit si le tableau est statique on passe un tableau de pointeur sur les sous-tableaux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int t[3][3];
    int* t_p[3];
    for(int i=0;i<3;i++){
    t_p[i]=&t[i];
    }
     
    f(t_p,sizeof(t_p));
    On peut aussi passer l'adresse d'un tableau linéaire traité comme un tableau 2D en passant les dimensions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void f (T *p, size_t x, size_t y)
    il suffit ensuite de calculer l'adresse de l'élément [i][j] avec la formule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    T *a = p + (j * x) + i;

  8. #8
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    L'important à savoir c'est qu'un tableau de dimension n, de cellules contigues peut être traité comme un tableau a une dimension.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  9. #9
    Membre averti
    Homme Profil pro
    Ingénieur systèmes embarqués
    Inscrit en
    Juillet 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur systèmes embarqués
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2006
    Messages : 42
    Par défaut
    Merci à tous pour vos réponses si rapide. Votre aide m'a été très précieuse.
    Merci encore

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

Discussions similaires

  1. [Tableaux] tableau double entrée
    Par molesqualeux dans le forum Langage
    Réponses: 3
    Dernier message: 09/12/2005, 15h19
  2. tableau double entrée et requete sql
    Par oceane751 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 29/11/2005, 14h25
  3. [MySQL] Tableau double entrée et requete sql
    Par oceane751 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 28/11/2005, 09h07
  4. tableau double entrée
    Par Andrey dans le forum C
    Réponses: 16
    Dernier message: 08/11/2005, 15h33
  5. [XSLT]tableau double entrée avec cellule manquante
    Par nferay dans le forum XSL/XSLT/XPATH
    Réponses: 9
    Dernier message: 08/03/2005, 15h07

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