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

Langage C++ Discussion :

comment vérifier la taille d'un tableau en argument de fonction


Sujet :

Langage C++

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Doctorant en Geomodélisation
    Inscrit en
    Octobre 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Geomodélisation

    Informations forums :
    Inscription : Octobre 2007
    Messages : 7
    Points : 9
    Points
    9
    Par défaut comment vérifier la taille d'un tableau en argument de fonction
    Bonjour,

    ma question est peut être plus une question de méthode. J'aimerais savoir si il y a un moyen de s'assurer de la taille d'un tableau passé en paramètre d'une fonction.

    Il y a plusieurs raisons à cela :
    • s'assurer de la bonne utilisation de la fonction par le code client. Je ne voudrais pas par exemple que le code client passe un tableau de 2 éléments quand il en faudrait 4.

    • avoir une fonction qui a un comportement différent selon le nombre d'éléments dans le tableau


    Je sais que lorsqu'un tableau est passé comme argument d'une fonction c'est en fait implicitement un pointeur qui est passé, et c'est ce qui pose problème justement. J'ai bien pensé à demander un second argument contenant le nombre de champs dans le tableau, mais cela ne résout que partiellement le problème car rien ne garanti que le tableau passé fasse effectivement la taille annoncée.

    Pour illustrer ma question :
    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
     
    #include <iostream>
    #include <cstdlib>
     
    void f( int entier[4], int n ){
      std::cout<<"il y a "<<n<<" entiers."<<std::endl;
      for( unsigned int i = 0; i<n ; ++i ){
        std::cout<<"  entier "<<i<<" : "<<entier[i]<<std::endl;
      }
    }
     
    int main( int argc, char* argv[]){
      int entier4[] = {0,1,2,3};
      int entier8[] = {0,1,2,3,4,5,6,7};
      f(entier8,8); // good behaviour
      f(entier4,8); // bad behaviour
      return EXIT_SUCCESS;
    }
    cela retourne :
    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
    il y a 8 entiers.
      entier 0 : 0
      entier 1 : 1
      entier 2 : 2
      entier 3 : 3
      entier 4 : 4
      entier 5 : 5
      entier 6 : 6
      entier 7 : 7
    il y a 8 entiers.
      entier 0 : 0
      entier 1 : 1
      entier 2 : 2
      entier 3 : 3
      entier 4 : 0
      entier 5 : 0
      entier 6 : 852933709
      entier 7 : 32669
    Merci d'avance pour votre aide

    PS: je poste ici et non dans le forum C car je travaille effectivement en C++ et celui-ci apporte peut être des solutions différentes à ce problème.

  2. #2
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Citation Envoyé par cijad Voir le message
    je poste ici et non dans le forum C car je travaille effectivement en C++ et celui-ci apporte peut être des solutions différentes à ce problème.
    Effectivement: en c++, on utilisera plutôt une classe conteneur pour manipuler des tableaux. Par exemple un vecteur (voir std::vector), plutôt qu'un int[]. Et du coup, les conteneurs possèdent une fonction size() qui te donne la taille du tableau.

    A noter que si tu choisis d'uitiliser un tableau, il sera certainement préférable de le passer par référence (éventuellement constante), plutôt que par valeur.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  3. #3
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut, et bienvenue sur le forum.

    De manière générale, il est très rare que l'on crée une fonction prenant en paramètre un tableau d'éléments de taille fixe.

    En C, nous passerons généralement un pointeur sur le pemier élément du tableau (ce qui revient en réalité à passer le tableau lui-même ) et, pour s'assurer de la taille du tableau, nous demanderons à l'utilisateur de l'indiquer explicitement, sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void foo(Type * ptr, int size)
    {
        printf("we have (normally) %d elements in our vector",size);
    }
    En C++, nous préférerons utiliser une classe créée tout spécialement pour gérer des tableaux d'éléments contigus en mémoire: la classe vector, disponible dans l'espace de noms std par simple inclusion du fichier d'en-tête <vector>.

    Cette classe apporte énormément de sécurité à l'utilisation, entre autre pour tout ce qui a trait à la gestion de la mémoire et à l'utilisation des pointeurs. Il est donc fortement recommandé d'en user et d'en abuser

    De plus, elle a l'énorme avantage de connaitre sa taille, ce qui nous intéresse ici, car tu peux donc vérifier à n'importe quel moment que l'utilisateur a placé un nombre correct d'élément dans le tableau

    La fonction qui permet de ce faire est la fonction membre size(). tu pourrais donc t'assurer de la présence d'un nombre correct d'éléments avec un code proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void bar(std::vector<UnType> /* const */ & tab)
    {
         if(tab.size()== 8
         {
            std::cout<<"le tableau continent bien 8 elements, c'est ce qui etait"
                     <<" attendu";
         }
         else
         {
             std:::cout<<"j'attendais un tableau de 8 elements, or il en contient "
                           <<tab.size();
         }
    }
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Doctorant en Geomodélisation
    Inscrit en
    Octobre 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Geomodélisation

    Informations forums :
    Inscription : Octobre 2007
    Messages : 7
    Points : 9
    Points
    9
    Par défaut
    Merci pour vos réponses.

    En effet std::vector se révèle être une bonne option. Je l'avais écartée dans un premier temps en réfléchissant à ce problème parce qu'elle m'avait paru beaucoup plus complexe qu'un tableau au premier abord et que le code client de mes objets manipule plutôt des tableaux.

    Jusque là je voyais std::vector comme un conteneur qu'on initialise, rempli, puis sur lequel on itère pour manipuler son contenu ... Suite à vos réponses j'y ai regardé de plus près et c'est vrai que std::vector peut se manipuler vraiment comme un tableau, notamment à sa construction.

    merci encore et bonne journée

  5. #5
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    Pour des tableaux C :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    template<int N>   void
    f( const int (& entier)[N] )
    {
      std::cout<<"il y a "<<n<<" entiers."<<std::endl;
      for( unsigned int i = 0; i<n ; ++i ){
        std::cout<<"  entier "<<i<<" : "<<entier[i]<<std::endl;
      }
    }
    devrait suffire :

    http://codepad.org/JfIYfpS1

  6. #6
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    Pour le code de Joel (qu'on trouve aussi dans la FaQ comeau), il ne faut pas oublier que le tableau ne doit pas être alloué dynamiquement. (A cause du template qui sera évalué à la compilation).

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Doctorant en Geomodélisation
    Inscrit en
    Octobre 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Geomodélisation

    Informations forums :
    Inscription : Octobre 2007
    Messages : 7
    Points : 9
    Points
    9
    Par défaut
    Merci pour l'astuce avec les templates

    Je n'avais jamais réalisé que l'on pouvait faire ce genre de chose.
    Ils sont décidément vraiment très fort ces templates.

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

Discussions similaires

  1. Réponses: 13
    Dernier message: 07/05/2006, 11h54
  2. comment augmenter la taille d'un tableau ?
    Par salseropom dans le forum C
    Réponses: 5
    Dernier message: 16/12/2005, 12h47
  3. 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
  4. [Tableaux] Comment connaitre la taille d'un tableau?
    Par Polaire76 dans le forum Langage
    Réponses: 2
    Dernier message: 21/11/2005, 17h34
  5. [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

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