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 :

récupérer la taille d'un tableau


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut récupérer la taille d'un tableau
    Salut à tous.
    J'ai une petite question qui me trotte dans la tête depuis un certain temps.
    Quand on initialise un tableau d'int avec new [15] par exemple, tout le monde sait qu'on peut le désallouer avec un simple delete [] sans jamais spécifier la taille du tableau. On m'a appris que le C++ se souvenait de la taille du tableau aloué. Mais puisqu'il est capable de s'en souvenir, pourquoi n'est-il pas possible de récupérer cette taille à volonté? Ce serait très utile pour un tableau de taille dynamique.
    Merci d'avance pour ceux qui me répondront.

    PS: c'est une simple question de curiosité, je suis passé depuis longtemps aux vectors.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    En standard, tu ne peux, car ça dépend de l'implémentation.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    EDIT : j'avais dit une bêtise

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut
    Citation Envoyé par Alp
    Et un sizeof(tab)/sizeof(int) ?
    Un sizeof, si je ne me trompe pas, ca va te renvoyer la taille de ton pointeur sur le tableau, donc 4 octets sur une archi 32 bits.

  5. #5
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Oui oui, j'ai pas réfléchi, c'est venu tout seul lol.
    Au pire tu parcours le tableau jusqu'au segfault

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut
    Citation Envoyé par Alp
    Oui oui, j'ai pas réfléchi, c'est venu tout seul lol.
    Au pire tu parcours le tableau jusqu'au segfault
    Ca me semble un peu radical

  7. #7
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Mais avec un peu de rigueur, tu peux, à chaque réallocation de ton tableau, stocker la taille dans une variable de même portée que le tableau.

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Par défaut
    Citation Envoyé par Alp
    EDIT : j'avais dit une bêtise
    En fait, non. Standard, 5.3.2-2 : When applied to an array, the result is the total number of bytes in the array. This implies that the size of an array of n elements is n times the size of an element.

    Donc sizeof(array)/sizeof(T) renvoie le nombre d'éléments d'un tableau de T.

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Mais dans le cas présent, c'était une bêtise, puisqu'il est pas question de tableau mais de pointeur vers une zone allouée dynamiquement.

    Le coup du sizeof ne marche que sur un tableau statique/automatique (ou peut-être à la rigueur un VLA) mais pas sur des données dynamiques...

    En C++ sous Visual, on a la macro ARRAYSIZE() qui fait le calcul et en profite pour vérifier que c'est bien un tableau qu'on lui passe en paramètre.
    En C, la macro ARRAYSIZE() ne fait que le bête calcul, sans vérification.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut
    Et si c'est un int* et non pas un int [x]? Forcément si la taille est fixée à la compilation on a même pas besoin de deviner la taille (quoi que dans la norme C99 je me demande ce que ca donnerait).

  11. #11
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Comme déjà dit, sizeof() ne marche pas comme on le souhaite sur un int *.
    ARRAYSIZE() non plus, d'ailleurs, mais en C++, ça ne compile pas non plus.

    Et si, sizeof() a de l'intéret pour les tableaux statiques. Notamment quand on doit passer la taille d'un buffer à une fonction qui prend en entrée un buffer et sa taille. Cela permet de centraliser les modifications.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut
    D'accord, mais c'est quand même étrange.
    Je n'ai jamais rencontré de compilateur obligeant à indiquer la taille lors d'un delete[], donc tous stockent la taille d'une façon ou d'une autre. Ca me semble être une abhération qu'on ne puisse pas récupérer cette information quasi vitale. Je me demandais seulement quelle pouvait en être la raison.

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

Discussions similaires

  1. Récupérer la taille d'un tableau
    Par mimi51340 dans le forum Collection et Stream
    Réponses: 18
    Dernier message: 29/03/2008, 09h30
  2. Récupérer la taille d'un tableau en perl
    Par Info_76 dans le forum Langage
    Réponses: 3
    Dernier message: 20/03/2008, 14h47
  3. Réponses: 13
    Dernier message: 07/05/2006, 11h54
  4. 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
  5. 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

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