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 :

Taille d'un tableau statique


Sujet :

C++

  1. #1
    Invité
    Invité(e)
    Par défaut Taille d'un tableau statique
    Bonjour à tous, j'ai vu ici comment calculer la taille d'un tableau statique.
    Mon main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #include <iostream>
    int main() {
        int a[2] = {1, 2};
        std::cout << (sizeof(a) / sizeof(*a)); // affiche bien 2
    }
    Donc ici, tout va bien, mais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    template<typename T>
    long unsigned int taille(T tab[]) {
        return (sizeof(tab) / sizeof(*tab));
    }
    Quand j'appelle cette fonction, elle me renvoie 1 (j'ai affiché les sizeof dans la fonctions et les deux valent 4 ??).
    J'ai essayé de déclarer la fonction en inline (vu que le code est inséré quand la fonction est appelée), mais ça n'a pas fonctionné.
    Ensuite, j'ai essayé avec des tableaux de tailles différentes et les sizeof valent tout le temps 4.
    Pourquoi ?

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 760
    Par défaut
    Calculer la taille d'un tableau avec sizeof est moche et dangereux si on change le type de tableau (par exemple si finalement on veut utiliser std::vector: le résultat de sizeof ne dépend pas de la taille du vector).

    std::size est fait pour ça.

    Les paramètres de fonction qui ressemble à des tableaux C sont des mensonges: ce sont des pointeurs. Avoir une variable qui fait véritablement référence à un tableau ne se fait pas comme ça.

    std::array pallie à ce genre de problème. Un article que j'ai écrit sur son bien fondé par rapport au tableau C: std::array, oui, mais pourquoi ?.

    Franchement, regarder un forum C pour faire du C++ n'est pas la bonne approche.

  3. #3
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 602
    Par défaut Taille et détail
    Bonjour,

    sizeof(Tab) renvoie la taille du pointeur Tab (pas la taille du tableau) soit 4 octets en 32 bits.
    sizeof(*Tab) renvoi la taille du premier élément du tableau Tab (*Tab <=> Tab[0]) ici un entier de 32 bits soit 4 octets.

    Donc sauf si on change de type de compilation (par exemple passer en 64 bits) ou de type d"élément le résultat sera invariablement le même quelque soit la taille du tableau.

    sizeof n'est donc pas la bonne solution ici.

    Salutations

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Ce code est du C. Les tableaux en C++ ce sont std::vector et std::array.
    Et un type[] est un tableau dont la taille n'est pas connue, sauf s'il est assigné lors de sa déclaration et qu'on reste dans le scope de sa déclaration int vars[] = {0,1,3,4,};. En paramètre d'une fonction, aucune chance.
    Quant au lien que tu donnes, connaître la taille d'une chaîne de caractères, via strlen, repose sur un principe très simple : les chaînes de caractères finissent par un \0. La taille c'est donc juste compter les caractères jusqu'à tomber sur ce \0. C'est un sacré cas particulier de tableau.
    En C, le seul et unique moyen fiable est de stocker la taille du tableau à côté.
    En C++ on a accès à std::vector et std::array qui devraient juste être utilisés. Il n'y a absolument aucune excuse valable pour déclarer un tableau C quand std::array existe.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 759
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 759
    Par défaut
    Citation Envoyé par totosayen Voir le message
    Pourquoi ?
    En C , le type tableau [] est dégradé en pointeur lors du passage de paramètres. Il faut rester dans la même unité de compilation pour "garder" le tableau (<- si cela n'a pas été changé depuis, parce que tu compiles en C++)

    Donc sizeof(tab) ne donnera plus la taille du tableau, mais la taille d'1 pointeur donc soit 4 (32 bits) soit 8 (64 bits)

  6. #6
    Invité
    Invité(e)
    Par défaut
    Merci à tous pour vos réponses cohérentes et utiles (c'était rapide ) !
    Je ne l'ai pas dit mais j'ai utilisé un tableau statique pour un exo (créer ma propre classe std::vector) et j'avais besoin d'un tableau à la C.
    J'utiliserai dorénavant std::size, comme vous me l'avez conseillé.
    Bonne nuit à tous !

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

Discussions similaires

  1. Adresse et taille d'un tableau statique
    Par Aspic dans le forum C
    Réponses: 16
    Dernier message: 31/03/2014, 20h58
  2. Réponses: 5
    Dernier message: 12/12/2013, 11h43
  3. Réponses: 5
    Dernier message: 02/05/2009, 15h27
  4. taille tableau statique
    Par Rniamo dans le forum C++
    Réponses: 14
    Dernier message: 14/06/2008, 16h16
  5. qbasic : taille d'un tableau
    Par clood200 dans le forum Basic
    Réponses: 2
    Dernier message: 16/09/2003, 07h26

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