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 dynamique


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de Le Barde
    Homme Profil pro
    Chanteur
    Inscrit en
    Juillet 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Chanteur

    Informations forums :
    Inscription : Juillet 2007
    Messages : 343
    Par défaut Taille d'un tableau dynamique
    Bonjour,

    J'ai besoin de récupérer la taille d'un tableau alloué dynamiquement. Par contre, je n'utilise pas les vector de la STL, ce qui donne ceci, dans le genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int RecupTaille(int* TabeauDEntiers)
    {
        int Taille;
        // Et maintenant... On veut récupérer la taille du tableau.
    }
    1. J'ai bien vu la FAQ C++ à ce sujet, qui dit que pour récupérer la taille d'un tableau alloué dynamiquement, c'est impossible sans utiliser vector.

    2. (Je vais en faire un template, mais plus tard, ici c'est pour l'exemple)

    Alors ma question, puisque j'en ai besoin et que je suis obstiné, c'est est-ce qu'il est possible de faire un accès à TableauDEntiers[Taille] jusqu'à ce que l'on obtienne une exception et alors renvoyer Taille ?

    --> de cette manière, cela donnerait :

    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
     
    int RecupTaille(int* TabeauDEntiers)
    {
        int Taille=0;
        try
        {
            while 1
            {
                TableauDEntiers[Taille];
            }
        }
        catch(...)
        {
            return Taille;
        }
    }
    Merci d'avance pour vos remarques, idées...
    Le Barde.

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    Salut,


  3. #3
    screetch
    Invité(e)
    Par défaut
    plusieurs solutions, toutes aussi peu propres que les autres!

    - allouer une case supplementaire et y stocker la taille
    ensuite tu renvoies le premier vrai element du tableau
    en gros :
    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
     
    int* createTableau(int size)
    {
        result = (int*) malloc(sizeof(int)*(taille+1));
        *result = size;
        return result+1;
    }
     
    void destroyTableau(int*)
    {
        free(tableau-1);
    }
     
    int tailleTableau(int* tableau)
    {
        return tableau[-1];
    }
     
    void utiliseTableau(int* tableau)
    {
        for(int i = 0; i < tailleTableau(tableau); ++i)
            printf("tableau[%d]=%d\n", i, tableau[i]);
    }
    - stocke un element de fin, comme les string C : 0 marque la fin de la chaine. Cela signifie que tu ne peux plus mettre 0 dans le tableau. Tu peux prendre une valeur "magique" qui ne sera jamais mise dans le tableau.



    Cela signifie que tu dois avoir tes propres routines de creation et de destruction de tableau, si tu les recois de l'exterieur alors c'est foutu, c'est trop tard.

  4. #4
    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
    Pourquoi ne peux tu pas utiliser de vector?

  5. #5
    Membre éclairé
    Avatar de Le Barde
    Homme Profil pro
    Chanteur
    Inscrit en
    Juillet 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Chanteur

    Informations forums :
    Inscription : Juillet 2007
    Messages : 343
    Par défaut
    Ouh là, vous avez répondu trop vite, j'étais en train de rédiger mon message

    C'est le bon message maintenant

  6. #6
    Membre éclairé
    Avatar de Le Barde
    Homme Profil pro
    Chanteur
    Inscrit en
    Juillet 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Chanteur

    Informations forums :
    Inscription : Juillet 2007
    Messages : 343
    Par défaut
    @ Alp : Je ne peux pas utiliser vector... pour la simple et bonne raison que ce n'est pas moi qui ai commencé le projet et que les personnes qui avaient déjà commencé à coder n'en utilisaient pas. Je continue donc dans leur lancée.

  7. #7
    screetch
    Invité(e)
    Par défaut
    non on ne peut pas faire ce que tu fais car ce qu'il y a au dela du tableau t'appartiens peut etre toujours donc ca ne detecte pas la fin du tableau mais la fin de la zone accessible. Quand a savoir si on peut vraiment catcher les violations d'acces, rien que d'y penser ca me fait fremir.

    Si tu peux stocke la taille, sinon c'est impossible, tu es mouru =)

  8. #8
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    Citation Envoyé par screetch Voir le message
    Quand a savoir si on peut vraiment catcher les violations d'acces, rien que d'y penser ca me fait fremir.
    Le debuggeur de Visual le permet bien, ça a son utilité (oui bon pour du debug uniquement pas de la manière proposée ici ^^)

  9. #9
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Par défaut
    Citation Envoyé par Le Barde Voir le message
    @ Alp : Je ne peux pas utiliser vector... pour la simple et bonne raison que ce n'est pas moi qui ai commencé le projet et que les personnes qui avaient déjà commencé à coder n'en utilisaient pas. Je continue donc dans leur lancée.
    Discrètement tu glisses un petit #include <vector> personne n'en saura rien . Franchement si le projet est en C++ pourquoi ce privé d'un apport essentiel par rapport au C : la STL

    Sinon pour ta question ça me parait totalement impossible

    Le coup du catch exception . Bonjour les problèmes de maintenance après alors que la STL permet justement de l'améliorer énormément.

    Enfin bref, impose le vector ou n'essayes pas de récupérer la taille du tableau.

  10. #10
    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
    Il est effectivement impossible de récupérer la taille d'un tableau vu que d'après ton prototype, tu as un pointeur et non pas un tableau. Quant à essayer d'aller voir au delà du tableau, celà va causer un comportement indéfini. Donc aucune exception ou autre erreur n'est garantie.

    Le plus simple est effectivement d'utiliser vector. En fonction des performances dont tu as besoin, tu peux peut être te permettre d'utiliser vector autant que possible, en copiant ton tableau dans un vector et en propageant l'utilisation du vector petit à petit dans le code existant. Vu que le vector a grosso modo la sémantique d'un tableau C, ça ne devrait poser trop de problèmes.

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,
    Citation Envoyé par befalimpertinent Voir le message
    Enfin bref, impose le vector ou n'essayes pas de récupérer la taille du tableau.
    Je serais plus gentil en te laissant choisir deux solutions... mais dont il faudra bien imposer l'une des deux:

    Soit tu impose vector, ce qui, entre nous t'évitera bien des désagréments, soit tu impose que la taille du tableau soit systématiquement transmise quand le tableau est transmis...

    Mais toute tentative de faire autrement que ces deux propositions mênera irrémédiablement le projet dans le mur, si pas aujourd'hui, tu peux te dire que la loi de Murpy fera que ce sera le jour de la remise et de la présentation au client
    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

  12. #12
    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
    Si tableau à taille variable : std::vector . Tu peux t'en servir comme un tableau C. Cf

    Si tableau de taille fixe : boost::array (cf ma signature)

    Te laisse pas faire. Si tu n'as aucune contrainte, utilise les meilleurs outils.
    Tu pourras de plus assez facilement te servir de l'un comme de l'autre dans du code C-like.

  13. #13
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Ce n'est pas une bonne solution du tout, et ce pour plusieurs raisons :
    - Ce genre d'erreurs est récupérée par le noyau, qui doit ensuite la fournir à l'utilisateur. Cela impose une ABI pour les exceptions extremement lourde. D'ailleurs il me semble qu'elle ne supporte pas finally (les destructeurs).
    - Si ton allocateur décide de fournir les octets 128-252 lors d'une allocation, puis les octets 256-380 lors d'une autre allocation, en utilisant les octets 252-256 pour y stocker des infos diverses (comme la taille du segment), tu ne détecteras jamais que tu arrives à la fin de ton tableau qui se trouve aux cases 128-252, tout simplement parce qui suit reste de la mémoire valide allouée par le processus. Au contraire tu risques d'écrire et de faire des conneries à des endroits auxquels tu ne devrais surtout pas toucher.

    Il faut que tu stockes l'information sur la taille de ton tableau d'une manière ou d'une autre, par exemple avec un caractère spécial en fin ou avec un champ séparé qui indique la taille.
    Alternativement, certains allocateurs permettent de connaître la taille d'un segment à partir de son adresse. (ce qui est généralement plus grand que la taille originellement demandée)

  14. #14
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    Le problème c'est que tu n'est pas sûr d'avoir une erreur si tu dépasses la taille du tableau :

    - soit la mémoire après ton tableau est invalide et tu auras une segfault ou une valeur qui ne correspond à rien.
    - soit la mémoire après a été allouée et dans ce cas tu auras la valeur d'autre chose (pour peu que ce soit du même type).

    Fin bref l'accès à la mémoire comme ça a un comportement indéfini, donc impossibel de s'en servir pour déduire quoi que ce soit.

    Donc en gros tu peux :

    - prendre les solutions proposées par screetch.
    - regarder du côté de boost::array si tu souhaites absolument utiliser des tableaux et pas des vecteurs.

+ 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