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

Langage Delphi Discussion :

Comment redimensionner un tableau dynamique ?


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 141
    Points : 43
    Points
    43
    Par défaut Comment redimensionner un tableau dynamique ?
    Bonjour

    Voila je gère un tableau dynamique que je rempli au fur et à mesure des événement. mais je voulais savoir si on peut (dans le cas ou je m'appercoit que le tableau n'est pas assez grand) rajouter "n" élément sans biensur effacer le contenu des élément précédemment crée? (un ajout d'élément quoi )

    merci d'avance pour l'aide

  2. #2
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 152
    Points
    10 152
    Par défaut
    Oui, c'est possible
    Mais évidemment, au plus souvent tu fais cet agrandissement, au plus de temps de réallocation et de recopie tu perds
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  3. #3
    Membre éclairé Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Points : 717
    Points
    717
    Par défaut
    Utilise la fonction setlength(Tableau,nbreLigne,nbrColonne);

    Pour un tableau à 2 dimensions
    For crying out loud !

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 085
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 085
    Points : 886
    Points
    886
    Par défaut
    Citation Envoyé par PadawanDuDelphi
    Utilise la fonction setlength(Tableau,nbreLigne,nbrColonne);
    Pour un tableau à 2 dimensions
    non, c'est plutôt SetLength(String ou Tableau, Length)
    Ensuite , suffit de l'utiliser comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SetLength(Tab,10); 
    SetLength(Tab[0], Length(Tab[0])+2);
    SetLength(Tab[1], Length(Tab[1])+1);
    SetLength(Tab[2], N);

  5. #5
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Lorsque cela est possible, je préfère allouer un grand tableau dès le départ car SetLength peut prendre pas mal de temps d'exécution. L'utilisation d'un tableau statique est préférable car la mémoire nécessaire au tableau est allouée au démarrage du programme, tandis qu'avec SetLength, il peut se produire une erreur si il n'y a pas assez de mémoire disponible pour la nouvelle allocation.

    Par exemple, je préfère utiliser un TStringList plutôt qu'un array of String...

    A propos, quel est le type utilisé dans ton tableau ?
    De retour parmis vous après 10 ans!!

  6. #6
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    +1 sub0

    Les TStringList ont l'avantage de pré-allouer un certains espace, et si ca suffit pas d'allouer par "cran".
    Il n'y a pas de nouvelle alloc système (à ce que j'ai compris) à chaque ajout d'enreg.
    De plus on peut forcer la taille de la pré-allocation (me rappelle plus de la propriété ou méthode).
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  7. #7
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 30
    Points : 27
    Points
    27
    Par défaut
    J'utilise souvent les tableaux dynamiques, entre autres parce qu'on type directement l'élement du tableau et pour éviter les SetLength successifs
    j'utilise un champ capa:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function GetNewItem: TItemType;
    begin
      if Count >= Capa then
      begin
         Inc(Capa, <Valeur à définir au cas par cas>);
         SetLength(Items, Capa);
      end;
      Result := Items[Count];
      Inc(Count);
    end;
    De plus avec ModelMaker on peut définir un pattern pour ça.
    ___________________________
    Sub0 -> Pensez à utiliser la balise Code!

  9. #9
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par portu
    Citation Envoyé par PadawanDuDelphi
    Utilise la fonction setlength(Tableau,nbreLigne,nbrColonne);
    Pour un tableau à 2 dimensions
    non, c'est plutôt SetLength(String ou Tableau, Length)
    Ensuite , suffit de l'utiliser comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SetLength(Tab,10); 
    SetLength(Tab[0], Length(Tab[0])+2);
    SetLength(Tab[1], Length(Tab[1])+1);
    SetLength(Tab[2], N);
    Hé ben non, heu...
    PadawanDuDelphi à raison, on peu faire ce qu'il fait...
    Bidouilleuse Delphi

  10. #10
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 141
    Points : 43
    Points
    43
    Par défaut
    merci à tous pour vos réponse en cas de soucis (c'est que dans un cas particulier d'utilisation de mon logiciel) je redimensionne mon tableau en faisant un setLength...ça marche bien dans mon cas.

    Une derniere question sur les tableaux et le setLength.
    Dois après avoir utiliser mon tableau faire un setlength de 0 pour libérer la mémoire?

    merci encore

  11. #11
    Membre éclairé Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Points : 717
    Points
    717
    Par défaut
    Dois après avoir utiliser mon tableau faire un setlength de 0 pour libérer la mémoire?
    A priori Delphi le gère automatiquement à la destruction.

    Mais on sait jamais, donc...
    For crying out loud !

  12. #12
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 085
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 085
    Points : 886
    Points
    886
    Par défaut
    Citation Envoyé par waskol
    Hé ben non, heu...
    PadawanDuDelphi à raison, on peu faire ce qu'il fait...
    Ha oui désolé, c'est bon à savoir ça

  13. #13
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 152
    Points
    10 152
    Par défaut
    Citation Envoyé par PadawanDuDelphi
    A priori Delphi le gère automatiquement à la destruction.

    Mais on sait jamais, donc...
    T'en fais pas, même dans des cas tordus du genre : un tableau dynamique d'éléments qui ont besoin d'une terminaison (string, interface, ou record comprenant un de ces deux types, voire même un tableau dynamique incrusté), Delphi gère correctement le tout.

    C'est d'ailleurs ce genre de choses qui fait du Pascal sa réputation de "langage simple", par rapport au C.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  14. #14
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 409
    Points : 5 799
    Points
    5 799
    Par défaut
    salut

    Citation Envoyé par portu
    Ha oui désolé, c'est bon à savoir ça
    ne t'inquiette pas ta solution est tout aussi bonne si tu veut des tableau ayant un nombre d'element variable .
    car il peut arriver que l'on n'est pas besoin d'initialiser un tableau de 100 * 100
    mais juste la premiere ligne et les autre a 50

    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

Discussions similaires

  1. Réponses: 1
    Dernier message: 03/05/2007, 09h15
  2. Redimensionner un tableau dynamique
    Par WebPac dans le forum Delphi
    Réponses: 6
    Dernier message: 18/01/2007, 17h23
  3. Réponses: 9
    Dernier message: 22/06/2006, 21h06
  4. FAQ: Comment allouer un tableau dynamique
    Par beb30 dans le forum C
    Réponses: 14
    Dernier message: 02/05/2006, 17h13
  5. Comment passer un tableau dynamique en paramètre ?
    Par Charette dans le forum Langage
    Réponses: 2
    Dernier message: 21/04/2005, 12h28

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