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 :

allocation dynamique d'un tableau de pointeurs


Sujet :

C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 7
    Points : 3
    Points
    3
    Par défaut [*]allocation dynamique d'un tableau de pointeurs
    Bonjour !

    J'essaie désespérément d'allouer de la mémoire pour un tableau de pointeurs déclaré ainsi :

    La taille du tableau dépend d'une variable "taille" que je passe en paramètre d'un constructeur. Du coup, je tente d'allouer la mémoire comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      leafs = (STState*) malloc( taille * sizeof(STState*) );
    Mais apparemment le compilateur (gcc 4.1.1) n'aime pas trop mon cast car il dit ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    erreur: incompatible types in assignment of ‘STState*’ to ‘STState* [0u]
    J'ai essayé de caster de plusierus manières différentes, mais toujours avec le même résultat. Je commence à désespérer de trouver la solution un jour...

    Quelqu'un saurait-il m'indiquer la bonne manière de faire ?

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    [] signifie tableau, tableau.

    Si tu veux un tableau de pointeurs de taille non-spécifiée, tu dois utiliser un pointeur de pointeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    STState ** ppLeafs = NULL;
    Il pointera sur le dernier pointeur du tableau.

    Et tu pourras l'allouer ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ppLeafs = new STState* [taille];
    //Ou bien
    ppLeafs = static_cast< STState ** >( malloc(taille * sizeof *ppLeafs) );

    PS1: Pas de cast C-Style en C++, s'il te plait.
    PS2: Dans la mesure du possible, on utilise new à la place de malloc() (les exceptions notables étant la nécessité de réallocation et l'interaction avec certains codes C).
    PS3: Pourquoi ne pas utiliser un std::vector< STState* > ?

  3. #3
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Pourquoi utiliser un vector quand on en n'a pas besoin?

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Ca marche bien maintenant, ouf !

    Pour les vectors, je ne peux pas les utiliser car ma struture doit être la plus légère possible tant en mémoire qu'en complexité...

    Merci beaucoup !

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Citation Envoyé par coyotte507
    Pourquoi utiliser un vector quand on en n'a pas besoin?
    C'est ce que je me suis longtemps dit, mais il semblerait qu'ici la politique est "pourquoi se farcir la gestion d'un tableau quand un vector s'en occupe ?"

    Bien sûr, dans le cas présent, on a notre réponse: On veut un tableau flyweight.

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Citation Envoyé par coyotte507
    Pourquoi utiliser un vector quand on en n'a pas besoin?
    A partir du moment où tu alloues un tableau dynamiquement, tu as besoin de std::vector. Au moins pour avoir du code exception-safe.

    Pour les vectors, je ne peux pas les utiliser car ma struture doit être la plus légère possible tant en mémoire qu'en complexité...
    C'est pas plus complexe, et niveau occupation mémoire tu vas payer un ou deux entiers en plus par tableau. C'est réellement un problème ?

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    C'est pas plus complexe, et niveau occupation mémoire tu vas payer un ou deux entiers en plus par tableau. C'est réellement un problème ?
    Ben, dans ce cas particulier, avoir une complexité en (12*taille de la donnée) plutot qu'en (15*taille de la donnée) reste très intéressant, donc ça joue pas mal. Surtout que typiquement, je m'attend à gérer des tableaux de 4 éléments. si bien qu'en payant deux entiers en plus, ça multiplie ma complexité par 1,5 !

    Par contre :
    A partir du moment où tu alloues un tableau dynamiquement, tu as besoin de std::vector. Au moins pour avoir du code exception-safe
    C'est pas terrible cette histoire, y a pas moyen d'éviter ça !?

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Ben, dans ce cas particulier, avoir une complexité en (12*taille de la donnée) plutot qu'en (15*taille de la donnée) reste très intéressant, donc ça joue pas mal. Surtout que typiquement, je m'attend à gérer des tableaux de 4 éléments. si bien qu'en payant deux entiers en plus, ça multiplie ma complexité par 1,5 !
    Ca reste quand même anecdotique. Tu travailles sur quel genre de système pour avoir de telles contraintes ?

    C'est pas terrible cette histoire, y a pas moyen d'éviter ça !?
    Si, il "suffit" de ne pas oublier de libérer la mémoire allouée dynamiquement (et toute ressource en général) à chaque fois qu'une exception est levée. Ca peut sembler facile mais ça ne l'est pas tant que ça, d'autant plus que ça peut vite multiplier la taille du code.
    Je t'invite à lire ceci pour mieux te rendre compte :
    http://c.developpez.com/faq/cpp/?pag...POINTEURS_raii

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Ca reste quand même anecdotique.
    Oui, sans doute ^^

    Tu travailles sur quel genre de système pour avoir de telles contraintes ?
    Je travaille sur les Oracles des suffixes, une structure d'index utilisée entre autres pour la recherche de mots dans un texte. On sait depuis longtemps écrire des algos de complexité linéaire en temps et en mémoire pour faire ça, mais on travaille encore activement à en trouver de meilleurs.
    Dans mon cas par exemple, ça peut servir à chercher des séquences d'ADN dans des bass de données de gènes, tâches qui peuvent prendre beaucoup de temps, et donc où on aurait bien envie de rester deux fois moins de temps à attendre devant son ordinateur

  10. #10
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 279
    Points : 11 015
    Points
    11 015
    Par défaut
    Euh ... je veux bien que la compléxité soit proportionnelle à tes données, mais si tu as 4 données, que tu utilises 50 ou 4 octets pour les stocker ne changera rien à la compléxité de tes algos.
    Les impacts seront liés au cache et à la quantité d'éléments simultanément chargeables en mémoire.

    Quant au vecteur, typiquement il rajoutera a priori:
    - deux sizeof(int) (ou long) par rapport à un tableau statiquement connu pour contenir 4 éléments (boost::array<4>, ...)
    - un sizeof(int/long) par rapport à un tableau dynamique non redimensionnable qui se souvient du nombre d'éléments qu'il contient
    - rien par rapport à des tableaux redimensionnables.

    J'ai déjà vu des abus de roues réinventées pour faire plus léger/rapide qui étaient bien plus couteuses. Fais un typedef sur des vecteurs, prototype avec, tu seras toujours à temps de changer le typedef une fois les autres solutions classiques appliquées (pas de copies inutiles, resize/reserve au lieu de news intempestifs, ...)

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

Discussions similaires

  1. Allocation dynamique d'un tableau de pointeur
    Par Général03 dans le forum Débuter
    Réponses: 20
    Dernier message: 09/12/2009, 18h21
  2. Réponses: 2
    Dernier message: 05/03/2007, 18h37
  3. Réponses: 67
    Dernier message: 13/02/2007, 18h08
  4. Réponses: 13
    Dernier message: 01/10/2006, 00h25
  5. [PRO*C] Allocation dynamique d'un tableau de VARCHAR
    Par NéalZheimer dans le forum Interfaces de programmation
    Réponses: 5
    Dernier message: 07/07/2006, 13h02

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