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 :

Obtenir la taille d'un tableau dynamique


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur Autodidacte
    Inscrit en
    Janvier 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Autodidacte

    Informations forums :
    Inscription : Janvier 2008
    Messages : 46
    Par défaut Obtenir la taille d'un tableau dynamique
    Bonjour

    J'aimerais créer une fonction pour obtenir la taille d'un tableau dynamique.

    Je sais que l'opérateur sizeof sur un pointeur renvoie la taille de celui-ci et non la taille total des éléments pointés.
    J'ai lu qu'il existe des fonctions pour cette tâche (_msize sous windows par exemple).

    Logiquement, la taille d'un tableau alloué avec new[] est gardée en mémoire quelque part puisque l'opérateur delete[] sait combien d'éléments libérer.

    J'aimerais une explication ou un exemple de l'implémentation d'une tel fonction, car la majorité de mes classes n'utilisent aucune bibliothéque autre que celles que j'ai créés et j'aimerais continuer comme ça (c'est bon pour mon aprentissage).

    Merci d'utiliser de votre temps pour me répondre.

  2. #2
    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 dépis du fait que ça peut sembler complètement stupide, c'est impossible. Bon, en fait il y a une explication plausible: je crois que dans le cas des types primitifs, et avec certains systèmes de gestion du tas, stocker ce nombre n'est pas nécessaire et, en plus, une plus grande quantitié de mémoire sera réellement réservée. Au final, il n'y a aucun moyen prévu dans le standard pour retrouver cette taille.

    En dehors de ça, je ne peux que m'outrer en lisant pareille bétise:
    Citation Envoyé par Cbenlfun Voir le message
    la majorité de mes classes n'utilisent aucune bibliothéque autre que celles que j'ai créés et j'aimerais continuer comme ça (c'est bon pour mon aprentissage).
    Quel que soit le langage de programmation c'est une très mauvaise idée. Comprends bien que si, pour je ne sais quelle raison saugrenue, on se limitait tous à des +, -, *, / ça nous prendrait toujours trois semaines pour faire un démineur.
    D'après mon expérience, ce qui distingue un programmeur experimenté d'un débutant, ce n'est pas de savoir programmer en C++ ou en Java, c'est d'avoir le réflexe de chercher des solutions existantes pour chaque besoin générique au lieu de réinventer la roue.
    Alors fais les choses bien et va donc apprendre à te servir de la classe vector !

  3. #3
    Membre averti
    Homme Profil pro
    Développeur Autodidacte
    Inscrit en
    Janvier 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Autodidacte

    Informations forums :
    Inscription : Janvier 2008
    Messages : 46
    Par défaut
    Merci pour ta réponse malgré qu'elle est un peu insultante...
    Je vais tenter de mieux m'expliquer.

    Tu as raison, les bibliothèques sont indispensables pour tout programmeurs et je n'ai pas peur de les utiliser dans mes programmes.
    Ce que j'aurais du préciser c que depuis que j'ai commencé à apprendre le C++ je m'amuse à faire ma propre bibliothèque standard et autre (peut-être est-ce ridicule, peut-être est-ce inutile).
    Même si elle est très loin d'égaler les "vrai" bibliothèques utilisées et améliorées par des milliers de programmeurs depuis des décénies, j'aime bien me dire "cette roue, c'est moi qui l'a inventée" même si les autres roues de mon chariot ont été inventées pas d'autres...

    "N'a tu jamais démonté un appareil électronique par curiosité ou tenté de jouer l'oeuvre d'un grand compositeur pour le plaisir?"

    J'ai fait ma propre classe string avec une variable membre pour contenir la taille de la chaine et je suis très satisfait du résultat.
    La seule chose qui me dérange c'est que les chaine de caractères qu'ont lui affecte doivent se terminer par un '\0' car sinon son comportement est imprévisible.
    Bien que je n'ai pas encore eu de problème à cause de ça, j'aimerais que la taille des chaines qui viennent de l'extérieur soit vérifiée pour plus de sécurité.

    C'est sur que c'est possible mais peut-être faut-il connaitre en détails l'implémentation du système d'exploitation (si c'est le cas, j'abandonne, je vais accepter les fonction prévues à cet effet en étant très heureux qu'elles existes), mais si c'était possible de le faire avec des connaissances moyennes ma curiosité prendrait le dessus.

    En bref...
    Si je dois apprendre l'algèbre en hiéroglyphes pour implémenter de telles fonctions, je vais immédiatement marquer cette conversation comme résolue et utiliser _msize, mais sinon j'aimerais qu'on m'explique comment faire.

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par Cbenlfun Voir le message
    je vais immédiatement marquer cette conversation comme résolue et utiliser _msize, mais sinon j'aimerais qu'on m'explique comment faire.
    Sauf que _mzise ne marchera pas... Il y a plein de façons d'avoir un pointeur qui est passé à ta fonction. Essaie par exemple ce code :

    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
    19
    20
    21
    22
    23
    24
     
    #include <malloc.h>
    #include <iostream>
     
    using namespace std;
     
     
    void f(char *titi)
    {
    	char *toto = new char[15];
    	char *tutu = (char*)_alloca(42);
    	char *tata = toto+1;
    	cout << _msize(toto) << endl;
    	cout << _msize(titi) << endl;
    	cout << _msize(tutu) << endl;
    	cout << _msize(tata) << endl;
    }
     
    int main()
    {
    	char titi[] = "Salut !";
    	f(titi);
    	return 0;
    }

    Et non, rien n'existe en standard pour connaître la taille d'un bloc mémoire.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  5. #5
    Membre averti
    Homme Profil pro
    Développeur Autodidacte
    Inscrit en
    Janvier 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Autodidacte

    Informations forums :
    Inscription : Janvier 2008
    Messages : 46
    Par défaut
    Donc si je comprend bien, même les fonctions définies dans une quel conque bibliothèque ne peuvent régler mon problème et toute les classes string de tout le monde se fient sur le caractère '\0' pour repérer le dernier élément d'un tableau passé par un paramètre de type pointeur sur char?

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 478
    Par défaut
    Je ne peux que m'outrer en lisant une pareille bêtise :

    Citation Envoyé par zais_ethael Voir le message
    En dehors de ça, je ne peux que m'outrer en lisant pareille bétise.
    Quand on débute, on essaie surtout de comprendre comment ça marche, de la même manière que l'on apprend d'abord à écrire avant d'utiliser une machine à écrire. Nombreux sont les exercices où le recours aux bibliothèques extérieures toutes faites est interdit. Essayer de réinventer soi-même quelque chose, quand c'est pour l'exercice, est toujours bénéfique.

    À côté, tu t'apercevras très vite toi-même que « réemployer l'existant » a un coût. Il faut chercher la bonne bibliothèque, se l'approprier, s'y investir complètement pour maîtriser son API, qui bien souvent est mal documentée, et tout cela pour utiliser un produit dont tu n'as même pas la certitude qu'il est mieux écrit que ce que tu aurais toi-même fait. Il faut composer avec les bugs cachés puis, bien souvent, mettre en place des adaptateurs pour composer avec le fait que telle ou telle fonction n'est pas implémentée comme ton programme l'attend, si ce n'est pas implémentée du tout. Et en plus, tu ne peux pas répondre à l'avance de la pérénité dans le temps de cette bibliothèque.

    Après, impliquer une bibliothèque entière pour n'utiliser qu'un seul de ses modules ou de ses classes est aussi une hérésie. C'est une chose à laquelle on assiste de plus en plus souvent parce que les couches sont de plus en plus nombreuses, que l'utilisateur a de moins en moins le contrôle sur sa machine et parce que la course à la puissance (qui reste un bienfait par ailleurs) estompe les différences entre les implémentations à l'efficacité variable. Peu de gens savent encore si l'instance de leur objet dans la pile fait 256 octets ou 256 kilo-octets. Quand le projet gagne en importance, les dépendances s'accumulent et ça fait autant de ressources externes qu'il faut importer et installer avec ton projet. À l'inverse, une application d'importance moyenne capable de de n'utiliser que la bibliothèque standard et les appels systèmes facilitera énormément le travail des intégrateurs et des administrateurs systèmes, spécialement au niveau de la politique de sécurité.

    En général, je me définis une masse critique, au delà de laquelle je décide de recourir à une bibliothèque particulière et à partir de ce stade, j'essaie de l'utiliser massivement.

  7. #7
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Citation Envoyé par Cbenlfun
    Donc si je comprend bien, même les fonctions définies dans une quel conque bibliothèque ne peuvent régler mon problème et toute les classes string de tout le monde se fient sur le caractère '\0' pour repérer le dernier élément d'un tableau passé par un paramètre de type pointeur sur char?
    Ben oui.
    C'est décevant, hein ? Aucune magie.

    D'ailleurs, je viens de vérifier et la première chose que fait le constructeur de std::string(char* s) c'est un strlen sur s. (avec VS2008)

  8. #8
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Feo,
    Citation Envoyé par Arzar Voir le message
    Ben oui.
    C'est décevant, hein ? Aucune magie.

    D'ailleurs, je viens de vérifier et la première chose que fait le constructeur de std::string(char* s) c'est un strlen sur s. (avec VS2008)
    Ben oui, avec un char *, c'est le seul moyen. Comment voudrais-tu donc faire autrement ?

    Et tant que quelque part on utilise un char *, il faudra en passer par là.

  9. #9
    Membre averti
    Homme Profil pro
    Développeur Autodidacte
    Inscrit en
    Janvier 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Autodidacte

    Informations forums :
    Inscription : Janvier 2008
    Messages : 46
    Par défaut
    Dans ce cas, je vais laisser ma classe string comme elle est et passer à autres choses, mais par pure curiosité, quelqu'un pourrait-il m'expliquer grossièrement (si cela est possible) comment les fonctions de désallocation dynamique (comme l'opérateur delete[] par exemple) font pour libéré la bonne quantité de mémoire.

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 10/01/2007, 15h07
  2. Changer la taille d'un tableau dynamique
    Par clem1313 dans le forum Langage
    Réponses: 1
    Dernier message: 28/02/2006, 01h57
  3. Réponses: 6
    Dernier message: 16/01/2006, 13h29
  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. Connaitre la taille d'un tableau dynamique
    Par lewellah dans le forum C
    Réponses: 2
    Dernier message: 23/09/2005, 18h37

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