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 :

Comment récupérer la taille d'un tableau passé en argument à une fonction ?


Sujet :

C

  1. #1
    Membre actif Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Points : 225
    Points
    225
    Par défaut Comment récupérer la taille d'un tableau passé en argument à une fonction ?
    Bonsoir,

    je m'explique, enf fait j'appelle une fct à partir de mon main.
    L'argument passé est celui-ci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char  **fct(char *a[])
    Mon problème est que je ne trouve pas de moyen à savoir quelle taille a le tableau.
    J'ai essayé comme ceci, mais ça ne marche pas et je ne trouve pas d'autres solutions.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        while(a[compteur]!=NULL) 	
    { 		
                  printf("%s\n",a[compteur]); 		
                  compteur++; 	
    }
    Je précise que je ne peux envoyer la taille en plus en argument de la fonction.
    Si quelqu'un peux me donner une idée.

    Merci et bonne soirée
    Wer nicht probiert, verliert !!

  2. #2
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Citation Envoyé par je®ome
    Je précise que je ne peux envoyer la taille en plus en argument de la fonction.
    Si quelqu'un peux me donner une idée
    Moi j'ai une idée : Laisse tomber...

    à moins que ton tableau ait une structure particulière (comme les chaînes de caractères qui se terminent par le caractère nul ['\0']) il est impossible de récupérer la taillle de ton tableau
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  3. #3
    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 : 37
    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
    Points : 3 958
    Points
    3 958
    Par défaut
    En effet, c'est l'un des "problèmes" du C.
    Une méthode est que la 1ere case du tableau indique sa taille.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  4. #4
    Membre actif Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Points : 225
    Points
    225
    Par défaut
    Moi j'ai une idée : Laisse tomber...

    à moins que ton tableau ait une structure particulière (comme les chaînes de caractères qui se terminent par le caractère nul ['\0']) il est impossible de récupérer la taillle de ton tableau
    Chaque case du tableau se termine par " \0 ".
    Je ne comprends pas vraiment, veux tu dire que j' ajoute une case dans mon tableau avec un " \0 " ??


    Une méthode est que la 1ere case du tableau indique sa taille.
    J'imagine que le plus pratique , c'est d'envoyer le caractère dont le code ascii correspond à la taille de mon tableau, mais dans ce cas, comment je fais pour traiter un tableau d'une taille supérieure à 255 ?

    Qu'est-ce qu'il en est d' utiliser une variable globale pour reprendre la valeur dans la fonction ?
    Wer nicht probiert, verliert !!

  5. #5
    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 : 37
    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
    Points : 3 958
    Points
    3 958
    Par défaut
    Eviter les variables globale.
    Sinon pour le tableau il suffit de faire un tableau de "int" qui pourra aussi contenir des "char" car les "char" sont plus petit.
    Sinon si le tableau est vraiment grand et que le gaspillage due aux "int" est important il faut implémenter une structure perso du type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct{
    int taille_tableau;
    char *tableau[];
    }mon_tableau;
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  6. #6
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    ce que je veux dire, c'est que par exemple, pour utiliser ce que tu voulais faire...

    il fallait que tu sois SÛR que le tableau se termine par un NULL
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  7. #7
    Membre actif Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Points : 225
    Points
    225
    Par défaut
    C'est un énoncé que nous avons reçu, et la fonction ne peut pas prendre un autre argument que " char *char[] ", donc je ne peux faire une structure comme tu le proposes.

    Swoög, je ne pige pas, j'ajoute bien en dernier dans mon tableau
    et puis je boucle avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    i=0
    while(strcmp(a[i],"\0")!=0)
    {
            traitement...
            i++;
    }
    mais cela ne marche pas, même que à mes yeux, ça devrait.

    Ou veut tu dire par un pointeur NULL ?
    Wer nicht probiert, verliert !!

  8. #8
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    non, ce sont les éléments du tabeaux qui se terminent pas un caractère NUL : '\0'

    là, je te dis que le tableau doit avoir son dernier élement à NULL, c'est à dire que le dernier élément du tableau passé en paramètre doit être un pointeur NULL, càd un pointeur qui ne pointe nul part, il vaut 0, c'est la valeur NULL

    si c'est un exo (mis à part qu'on est pas censé être là pour faire vos exos et que la réponse doit être dans ton cours), et que ta fonction est censé accepter n'importe quel type de tableau, alors c'est mort.

    sinon, est-ce que tu as un peu plus d'infomations sur la façons dont doivent être structurés tes tableaux ? (ont-ils un format particulier, etc...)

    le coup de la variable globale pourrait marcher, mais ça sous entend qu'il n'y a qu'un seul tableau et puis les variables globales, c'est à éviter...

    la seconde solution, c'est une chaine de char se terminant par '\0' en premier élément, et la somme des codes ascii des caractères de la chaîne te donne le nombre des éléments dans ton tableaux...
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  9. #9
    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 : 37
    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
    Points : 3 958
    Points
    3 958
    Par défaut
    NULL est une valeur définie par le compilateur, elle vaut 0 généralement.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  10. #10
    Membre actif Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Points : 225
    Points
    225
    Par défaut
    non, ce sont les éléments du tabeaux qui se terminent pas un caractère NUL : '\0'

    là, je te dis que le tableau doit avoir son dernier élement à NULL, c'est à dire que le dernier élément du tableau passé en paramètre doit être un pointeur NULL, càd un pointeur qui ne pointe nul part, il vaut 0, c'est la valeur NULL

    sinon, est-ce que tu as un peu plus d'infomations sur la façons dont doivent être structurés tes tableaux ? (ont-ils un format particulier, etc...)
    Comme je l'ai dit avant, chaque case du tableau se termine par un caractère null.
    Donc j'alloue une case de plus dans mon tableau dans laquelle je ne mets rien ?

    chaque case du tableau comprend une chaine de caractères
    .
    Wer nicht probiert, verliert !!

  11. #11
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    tu ne lis pas, ou tu ne veux pas comprendre ce que j'écris...

    un peu plus haut, il t'as été conseillé d'utiliser la première chaîne de caractère pour stocker la taille, la seconde remarque que j'ai faite est juste une extension de celle là

    pour la première, non tu ne rajoute pas une chaîne vide à ton tableau, bien que ça pourrait être une idée...

    tu rajoutes un pointeur NULL, c'est à dire que ce n'est pas : mais
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  12. #12
    Membre confirmé Avatar de Mayti4
    Inscrit en
    Février 2004
    Messages
    442
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 442
    Points : 488
    Points
    488
    Par défaut
    Tu ne compares qu'un seul caractère.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while( a[i][0] != 0 )
    {
      ...
    }
    L'itération est humaine; la récursion, divine.

  13. #13
    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 je®ome
    Je précise que je ne peux envoyer la taille en plus en argument de la fonction.
    Si c'est ça, il y a un sérieux problème de conception. Sinon, tu peux utiliser le mécanisme des chaines (la sentinelle). Mais il faut 'sacrifier' une valeur...
    Pas de Wi-Fi à la maison : CPL

  14. #14
    Membre actif Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Points : 225
    Points
    225
    Par défaut
    C'est bon merci, il commençait à ce faire un petit peu tard hier soir.
    Je fais ma boucle comme je l'ai dit tout au début,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        while(a[compteur]!=NULL)     
    {         
                  /*  traitement  */        
                  compteur++;     
    }
    sauf que je n'avais pas ajouté un NULL à la fin du tableau.
    Merci et tous et veuillez m'excuser pour avoir été un peu long de détente
    Wer nicht probiert, verliert !!

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

Discussions similaires

  1. Comment récupérer la taille d'un tableau dynamique ?
    Par Tchaill39 dans le forum Langage
    Réponses: 4
    Dernier message: 08/12/2005, 14h21
  2. Réponses: 3
    Dernier message: 30/09/2005, 11h03
  3. Récupérer la taille d'un tableau (edit : et d'une iframe)
    Par Prue dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 11/08/2005, 15h54
  4. [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
  5. Réponses: 3
    Dernier message: 23/01/2004, 21h02

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