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++Builder Discussion :

Ajout d'éléments à un tableau dynamique déjà alloué [FAQ]


Sujet :

C++Builder

  1. #1
    Membre averti Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Points : 404
    Points
    404
    Par défaut Ajout d'éléments à un tableau dynamique déjà alloué
    Bonjour

    [bcb6]

    j'alloue de la memoire a un tableau de pointeurs de type int

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int *valeur;
    valeur =new int[26*sizeof(int)]; 
    for(int i=0; i<26; i++) valeur=i;
    Comment puis-je faire pour ajouter, par exemple, 20 nouveaux éléments à ce tableau sans détruire mes 26 premieres valeurs ? ....

    Merci Flo.

  2. #2
    LFE
    LFE est déconnecté
    Membre émérite

    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2002
    Messages : 95
    Points : 2 463
    Points
    2 463
    Par défaut
    lorsque la mémoire a ete allouée avec malloc, il est possible de faire un realloc.

    Mais je ne sais pas si ca marche avec un pointeur alloué avec new.

    A tester.

  3. #3
    Membre averti Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Points : 404
    Points
    404
    Par défaut
    peut etre avec malloc... mais j'avoue que depuis que je navigue sur ce forum (6/7 mois), on m'a toujours dit de preferer new à malloc... alors ... je prefererais une solution avec new. Enfin merci

  4. #4
    Membre régulier
    Avatar de bebeours
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 103
    Points : 123
    Points
    123
    Par défaut
    Je te conseille d'utiliser le type "vector" de la STL qui te permet d'ajouter, consulter, mettre à jour et supprimer des éléments (entre autres) où qu'ils soient dans ton tableau (ici appelé vecteur).

    Tu trouveras plus d'informations sur le type vector ici :
    http://www.cppreference.com/cppvector_details.html

    Ce sera plus joli je pense que d'utiliser des malloc et compagnie qui sont des vieux restes du C.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2013
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2013
    Messages : 24
    Points : 17
    Points
    17
    Par défaut
    Je sais que ce topic date d'il y a 13 ans, mais il s'agit du premier sujet sur lequel je suis tombé et qui concernait exactement ce que je cherchais.
    Pour ceux qui ont l'amour du "hand-made", je propose une toute autre manière de gérer une liste d'éléments dynamiques, l'utilisation d'une liste chaînée.

    En C++ (ou tout autre langage orienté objet) je conçois ceci en définissant une classe ayant au minimum 3 attributs essentiels :
    1. Un pointeur vers l'élément précédent (si c'est le premier élément de la liste alors on le met à NULL)
    2. La valeur de l'élément
    3. Un pointeur vers l'élément suivant (à mettre à NULL si il s'agit du dernier élément)


    Ce processus, que je trouve moins tiré par les cheveux qu'une allocation d'un nouveau tableau et beaucoup moins gourmand en mémoire (imaginez qu'on gère un ensemble de millions de données !), me paraît néanmoins plus difficile à implémenter. Comme certains l'auront déjà deviné, la difficulté majeure réside dans les accès aux éléments, car l'algorithme basique et crade auquel la plupart des développeurs penseront (et auquel j'ai pensé) sera linéaire, c'est-à-dire que chaque élément sera parcouru pour accéder à la donnée que l'on cherche: ce qui n'est donc pas du tout efficace du point de vue algorithmique; aussi l'on pourrait constater son efficacité médiocre sur un ensemble de plusieurs millions de données.

    J'imagine deux manières de s'y prendre :
    1. Une définition purement récursive que l'on retrouve dans un langage comme Caml (List.hd,List.tail) ... C'est-à-dire que la liste comprend une queue qui est le reste des éléments après sa tête (de la liste). Initiez-vous à Caml si cela ne vous dit rien, cela ne peut pas faire de mal.
    2. Autrement et moins difficilement on peut implémenter une liste chaînée de manière linéaire.


    De toute façon, pour faire de la première manière vous aurez probablement besoin de la deuxième.

    Cependant attention à la récursion car à chaque appel de fonction un nouvel environnement est crée dans la pile ce qui surcharge la mémoire inutilement. Il me semble qu'une option de GCC/G++ permet de mieux gérer le comportement récursif en C/C++ - mais je ne sais pas comment il s'y prend.

    Je pense qu'on passe un cap en programmation une fois que l'on a réussi à créer ses propres structures de données, et surtout lorsque que l'on y applique des traitements algorithmiques (que développe soi-même au fur et à mesure) pour les rendre toujours plus rapides et efficaces. Il existe un tas de manières de faire auxquelles je n'ai pas pensé, et auxquelles personne n'a encore pensé, et pouvoir concevoir ses propres méthodes tout en ayant en tête la complexité algorithmique différencie le codeur du dimanche de celui qui connaît vraiment son domaine. et on comprend mieux beaucoup de concepts (car un programme, tout comme la génétique ne permet que quatre opérations possibles). Tout cela pour dire que lorsqu'un codeur est autodidacte (mais pas uniquement), il est connu qu'il manque souvent de notions algorithmiques, et l'utilisation de std::vector à la volée ne fait pas pour le moins comprendre ce qui permet son comportement (surtout que le code de cette librairie est très peu accessible à un non-expert en C/C++).

    Merci à ceux qui auront lu. Bonne chance à ceux qui s'y essaieront.

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 23/12/2014, 14h34
  2. Ajouter des lignes à un tableau dynamiquement
    Par madina dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 03/10/2011, 12h05
  3. Réponses: 1
    Dernier message: 23/10/2007, 17h30
  4. [Tableaux] ajout d'élément dans un tableau
    Par maximenet dans le forum Langage
    Réponses: 3
    Dernier message: 28/02/2006, 20h24
  5. [JTable] Un tableau dynamique (ajout de lignes)
    Par fraoustin dans le forum Composants
    Réponses: 3
    Dernier message: 09/10/2005, 00h27

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