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 en parametre d'une matrice NON carrés


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Mars 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 11
    Points : 7
    Points
    7
    Par défaut Passage en parametre d'une matrice NON carrés
    Salut,
    J'ai un tableau de chaines de carateres de ce genre
    char *tab[]={"AAA","ABCDEF","C","AZERTYUIOP"};

    mon problème est de le passer en parametre à une fonction. Dans le cas d'une matrice carrée je connais mais c'est pas cas ici.
    De plus ce que je veux faire ressemble fort à : main(int argc, char *agrv[]) donc ça doit bien exister !
    J'ai bien la solution de passer un 2eme tableau avec les strlen(tab[n]) mais je pense qu'il doit y avoir plus simple.
    @+

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 36
    Points : 33
    Points
    33
    Par défaut
    ton problème est comment passer les paramètres ou comment savoir la taille du tableau.
    Pour le passage de paramètre char **.
    Pour la taille du tableau je ne vois pas à part mettre un marqueur de fin de tableau ou de faire un second paramètre indiquant la taille.

  3. #3
    Membre averti
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Points : 387
    Points
    387
    Par défaut
    Hello,

    Citation Envoyé par Steffane
    Salut,
    J'ai un tableau de chaines de carateres de ce genre
    char *tab[]={"AAA","ABCDEF","C","AZERTYUIOP"};

    mon problème est de le passer en parametre à une fonction. Dans le cas d'une matrice carrée je connais mais c'est pas cas ici.
    De plus ce que je veux faire ressemble fort à : main(int argc, char *agrv[]) donc ça doit bien exister !
    J'ai bien la solution de passer un 2eme tableau avec les strlen(tab[n]) mais je pense qu'il doit y avoir plus simple.
    @+
    Hé bien, t'y es pas avec main() ? C'est pareil. Il s'agit en l'occurence de tableaux de pointeurs vers char ou des pointeurs vers pointeurs vers char et non une matrice, et ici tab est un tableau de pointeurs vers char (un tableau de chaines de caractères pour faire simple), ce qui facilite la chose (l'utilisation de l'opérateur sizeof permettant de récupérer la taille). Donc il n'y a que la dimension de ce tableau qui importe, le caractère terminateur '\0' des chaines de caractères pouvant être exploité.

    Exple avec tab plus haut :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int disp(char ** jojo, int n)
    {
        --n;
        while( n >= 0) {
             puts(jojo[n]);
             --n;
        }
    }
     
    disp(tab, sizeof(tab) / sizeof(*tab));

    A+

  4. #4
    Membre actif Avatar de fumiste972
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Février 2003
    Messages
    228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Février 2003
    Messages : 228
    Points : 291
    Points
    291
    Par défaut
    Slt,
    je ne comprends pas trop ce que tu veux faire.Si c'est juste passer le tableau en parametre tu n'as qu'a declarer ta fonction comme t'a di mnaulet (ou bobby pour les intimes ) du style
    Maintenant il faut savoir que ton parametre tab pourra etre modifier par la suite dans ta fonction.

    Donc maintenant soit tu fais le meme type de declaration que dans le main (char* tab[]) ou si tu veux donner une taille a ton tableau (char* tab[n]) ou encore declarer ta variable en constante (const char** tab).

    Si ca ne reponds toujours pas reexplique stp.
    "L'ignorance, c'est la béatitude, ce qui explique peut-être pourquoi tout le monde sourit"
    Pensez au tag , ca évite de se galérer pour rien.

  5. #5
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    fumiste972
    Maintenant il faut savoir que ton parametre tab pourra etre modifier par la suite dans ta fonction.
    Plus précisément, les objets du tableau dont l'adresse est dans tab.
    Donc maintenant soit tu fais le meme type de declaration que dans le main (char* tab[]) ou si tu veux donner une taille a ton tableau (char* tab[n]) ou encore declarer ta variable en constante (const char** tab).
    Ces déclarations sont correctes, mais la seconde est perverse puisque le paramètre n est inopérant et ne sert à rien.

    Foobar1329
    ici tab est un tableau de pointeurs vers char (un tableau de chaines de caractères pour faire simple), ce qui facilite la chose ??(l'utilisation de l'opérateur sizeof permettant de récupérer la taille).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    disp(tab, sizeof(tab) / sizeof(*tab));
    A condition que la déclaration du tableau en question soit globale ou locale à la fonction qui appelle disp

    Sinon, pour la taille du tableau tab, pourquoi ne pas utiliser la même chose que pour argv et terminer le tableau de pointeur par NULL ? L'exploration du tableau est aussi facile qu'avec le nombre explicite d'éléments. La déclaration est à peine modifiée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *tab[]={"AAA","ABCDEF","C","AZERTYUIOP",NULL};
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  6. #6
    Membre averti
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Points : 387
    Points
    387
    Par défaut
    Hello,

    Citation Envoyé par diogene

    Foobar1329
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    disp(tab, sizeof(tab) / sizeof(*tab));
    A condition que la déclaration du tableau en question soit globale ou locale à la fonction qui appelle disp
    Oui, bien sûr.

    Citation Envoyé par diogene
    Sinon, pour la taille du tableau tab, pourquoi ne pas utiliser la même chose que pour argv et terminer le tableau de pointeur par NULL ?
    L'idée est bonne, d'autant plus que dans le cas d'une variable de type pointeur vers pointeur vers char, c'est un des seuls moyens que l'on a à disposition pour déterminer le nombre d'éléments (hormis le fait de passer directement la taille).

    Citation Envoyé par diogene
    L'exploration du tableau est aussi facile qu'avec le nombre explicite d'éléments. La déclaration est à peine modifiée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *tab[]={"AAA","ABCDEF","C","AZERTYUIOP",NULL};
    Mais...

    Je ne suis pas d'accord pour dire que l'accès aux éléments est aussi facile de même que je ne parlerais plus d'exploration de tableau dans ce cas. Le type de celle-ci change : le but d'un tableau est de fournir un accès direct a ses éléments, contrairement à un accès séquentiel ou plus complexe encore autre que l'on peut trouver avec d'autres structures de données. La solution de mettre NULL comme terminateur permet d'économiser un paramètre, certes, mais elle a l'inconvénient de devoir faire une lecture séquentielle du tableau avant de pouvoir faire les accès directs.

    Il faut aussi garantir que l'on ne trouvera NULL qu'une fois parmi les éléments et qu'il soit à la bien fin. Donc c'est une solution adaptée pour des données constantes mais plutôt handicapante avec des données manipulées/modifiées à l'exécution.

    A+

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Steffane
    Salut,
    J'ai un tableau de chaines de carateres de ce genre
    char *tab[]={"AAA","ABCDEF","C","AZERTYUIOP"};

    mon problème est de le passer en parametre à une fonction. Dans le cas d'une matrice carrée je connais mais c'est pas cas ici.
    De plus ce que je veux faire ressemble fort à : main(int argc, char *agrv[]) donc ça doit bien exister !
    C'est exactement ça. Il n'y a rien de plus à faire.
    Pas de Wi-Fi à la maison : CPL

  8. #8
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Foobar1329
    La solution de mettre NULL comme terminateur permet d'économiser un paramètre, certes, mais elle a l'inconvénient de devoir faire une lecture séquentielle du tableau avant de pouvoir faire les accès directs.
    Remarque pertinente. Tout dépend donc du traitement à effectuer dans la fonction. C'est sans doute pour cela que argv est accouplé avec argc ce qui permet de choisir sa méthode.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  9. #9
    Futur Membre du Club
    Inscrit en
    Mars 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Exacte ça marche mais j'ai toujours un warning
    argument #3 incompatible with prototype
    avec :
    ma fonction : int fonc( int v, char **tab){ ...... }

    mon appel : i=fonc( v, tab);
    @+
    ( mais sinon ça marche merci à tous )

  10. #10
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Exacte ça marche mais j'ai toujours un warning
    argument #3 incompatible with prototype
    avec :
    ma fonction : int fonc( int v, char **tab){ ...... }
    Vérifie le prototype, c'est bizarre, la fonction n'a pas 3 arguments!
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Steffane
    Exacte ça marche mais j'ai toujours un warning
    argument #3 incompatible with prototype
    avec :
    ma fonction : int fonc( int v, char **tab){ ...... }

    mon appel : i=fonc( v, tab);
    Curieux. Montre un copier/collé compilable du code exact qui provoque ce problème.
    Pas de Wi-Fi à la maison : CPL

  12. #12
    Futur Membre du Club
    Inscrit en
    Mars 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 11
    Points : 7
    Points
    7
    Par défaut dernier de dernier
    Après quelques essais j'ai vu que le warning venait du "const" avec lequel je déclarais le tableau.
    Merci à tous
    à+

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 24/12/2004, 17h46
  2. [VB.NET] Passage de parametres à une Applet Java
    Par AntiSAL dans le forum ASP.NET
    Réponses: 4
    Dernier message: 18/08/2004, 12h04
  3. [langage] Passage de paramètres dans une fonction
    Par And_the_problem_is dans le forum Langage
    Réponses: 11
    Dernier message: 28/06/2004, 09h20
  4. [langage] passage de paramètres à une fonction
    Par BARBIER dans le forum Langage
    Réponses: 4
    Dernier message: 07/05/2004, 16h46
  5. Passage de parametre a une anim Flash 5
    Par debug dans le forum Intégration
    Réponses: 4
    Dernier message: 03/06/2002, 18h59

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