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++

  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
    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.

  5. #5
    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.

  6. #6
    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

  7. #7
    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

  8. #8
    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.

  9. #9
    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
    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.
    Exact, et c'est ce qu'on fait toujours d'ailleur (pas trop le choix). Mais c'est pénible de se trimbaler avec ses variables 2 par 2, d'autant plus quand on sait que le C++ est parfaitement au courant de la taille de ton tableau.

  10. #10
    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
    Pas le C++ : Seulement le gestionnaire de tas.
    Et ça peut être stocké n'importe où : Juste avant le bloc mémoire, dans les données internes de gestion du tas, ou même calculé à la volée à partir de la taille en octets stockée dans les données internes...

    Mais même en C, il n'y a pas de fonction standard pour cela...
    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.

  11. #11
    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
    En C on doit aussi indiquer la taille du tableau à sa désalocation, c'est pas pareil.

    Mais ce que tu essayes de me dire c'est qu'à de fins d'optimisation la taille du tableau est déléguée à un système sous-jacent (système d'exploitation par exemple) qui n'est pas forcément controlable par programmation?

  12. #12
    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
    Citation Envoyé par zais_ethael
    En C on doit aussi indiquer la taille du tableau à sa désalocation, c'est pas pareil.
    Ah oui?? free() ne prend qu'un seul paramètre.
    (Mais je comprends ce que tu veux dire: free() ne détruit rien)

    Mais ce que tu essayes de me dire c'est qu'à de fins d'optimisation la taille du tableau est déléguée à un système sous-jacent (système d'exploitation par exemple) qui n'est pas forcément controlable par programmation?
    C'est possible. Par exemple, les fonctions internes de tas de Windows permettent de connaître la taille en octets d'un bloc alloué... Et comme les opérateurs d'allocation de C++ finissent par allouer sur le tas gracieusement fourni par l'OS...
    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.

  13. #13
    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
    Ok, je comprends mieux alors.

    Edit: ha oui, tu avais raison pour le C, je dois être un peu rouillé

  14. #14
    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
    Je mets l'accent sur "possible", bien sûr : Comme cela dépend de l'implémentation, on ne peut rien savoir.

    Ce qui est sûr toutefois, c'est que le standard aurait pu définir une fonction interrogeant le gestionnaire de Tas (interne à l'OS ou bien à la LibC) qui donnerait la taille d'un tableau alloué...
    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.

  15. #15
    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.

  16. #16
    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.

  17. #17
    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).

  18. #18
    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.

  19. #19
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    J'évite sizeof() sur un tableau pour ce genre de problème...
    Car cela économise du temps à chercher des problèmes dans le code pour rien... et cela évite une confusion..., une bonne variable avec la longueur du tableau en static ou autre (dépend du type de tableau et de son utilisation)

  20. #20
    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 Médinoc
    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.
    Est-ce que tu veux dire la chose suivante ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int f(int array[])
    {
    	return sizeof(array);
    }
    Dans ce cas, ça ne marche pas non plus, puisqu'un paramètre de type T[] est transformé en T*. Cf. Standard 8.3.5-3 et http://groups.google.com/group/comp....66d0252ded2390

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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