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

Free Pascal Discussion :

Redimensionner un tableau dynamique en un tableau statique [Free Pascal]


Sujet :

Free Pascal

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 22
    Points : 17
    Points
    17
    Par défaut Redimensionner un tableau dynamique en un tableau statique
    Bonjour,

    Je cherche à redimensionner un tableau dynamique de caractères en un tableau statique de caracteres.

    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
     
    program essai0003;
    {$MODE DELPHI}
     
    type 
    	gros = array [1..1000000]  of char;	
    var
    	ici : gros;
    	k : Integer;
    	dim : Integer;
    begin
    	writeln('Entree une valeur pour la dimension du tableau');
    	readln(dim);
     // redimensionner le tableau ici a dim
    end. // Final
    Je souhaite après avoir lu l'entrée clavier 'dim' transformer le tableau 'ici' de type 'gros' qui a une longueur 'long' en un 'ici' de taille statique 'dim', est-ce faisable?

    Sinon on m'a parlé de faire un record avec le tableau et une longueur réelle dim
    après suffirait de faire un truc :
    Si il y a une possibilité aussi en le faisant avec un pointeur je suis à l'écoute.
    C'est juste quand je prends l'exemple que j'ai un tableau de dimension 'dim', par exemple 10 caractères, et que je les trie par une procedure de tri bulle, le problème, le compilateur analyse tous les élèments de 'ici' qui est de type 'gros' et 'gros' c'est un array [1..1000000] of char, cela met donc un temps fou et ce n'est pas optimisé.


    Merci

  2. #2
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 945
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 945
    Points : 59 442
    Points
    59 442
    Billets dans le blog
    2
    Par défaut
    Bonjour et bienvenue !

    Un tableau dynamique se déclare sans taille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Var ici : Array of Char;
    A l'aide de SetLength,tu peux allouer la taille désirée et éventuellement redimensionner ton tableau par la suite.
    Attention de ne pas oublier de désallouer le tableau à la fin, à l'aide de Finalize (ou SetLength avec une taille nulle).

    Un bon tutoriel sur la gestion des tableaux dynamiques :
    http://pascal.developpez.com/cours/artdynarr/

    N.B. Je n'ai jamais travaillé avec les tableaux dynamiques sous Free Pascal, j'espère que ce qui précède est correct puisque tu es en mode de compatibilité Delphi.

  3. #3
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Points : 2 501
    Points
    2 501
    Par défaut
    Comme tu as defini le type gros, tu peux decider d'utiliser une partie de ton tableau. je crois que c'est cette solution qu'on t'a conseillé en te disant d'utiliser un record.
    Pour le faire, tu definis une variable long par exemple, et apres la lecture de dim, tu affecte cette valeur à long, et tu considere maintenant la taille maximale de ton tableau egale à long au lieu de 1000000.
    cette solution entraine une utilisation enorme de la memoire, mais permet d'acceder à un element en un temps O(1).

  4. #4
    Membre éclairé
    Avatar de richard
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2002
    Messages : 475
    Points : 779
    Points
    779
    Par défaut
    Citation Envoyé par Alcatîz Voir le message
    Attention de ne pas oublier de désallouer le tableau à la fin, à l'aide de Finalize (ou SetLength avec une taille nulle).

    Un bon tutoriel sur la gestion des tableaux dynamiques :
    http://pascal.developpez.com/cours/artdynarr/

    N.B. Je n'ai jamais travaillé avec les tableaux dynamiques sous Free Pascal, j'espère que ce qui précède est correct puisque tu es en mode de compatibilité Delphi.
    Sous Freepascal on ne désalloue pas la mémoire par Finalize, cela se fait automatiquement. Cf doc :

    http://www.freepascal.org/docs-html/ref/refsu14.html

  5. #5
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 22
    Points : 17
    Points
    17
    Par défaut
    Merci.

    Je me rends compte que :

    Un tableau dynamique est un tableau sans intervalle
    On sait travailler sur un tableau dynamique en utilisant setlength(tableau,element)
    Un tableau statique (avec un intervalle donc) est non redimensionnable et si l'on pense devoir optimiser le travail, il faudrait implementer un record qui contient un pointeur sur ce tableau.
    ( On doit voir les pointeurs après Pâques en classe)

    Merci beaucoup pour les réponses, et pour les liens.

  6. #6
    Membre éclairé
    Avatar de richard
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2002
    Messages : 475
    Points : 779
    Points
    779
    Par défaut
    Le mot intervalle est inapproprié : le tableau statique possède des bornes qui sont définies au moment de la compilation du programme. Le tableau dynamique (comme son nom l'indique) ne possède pas de telles bornes (sa taile est définie à l'exécution).

    Tout le reste est juste à une exception près : on peut tout à fait optimiser la taille d'un tableau dynamique (c'est même pour cela qu'ils ont été inventés) en connaissant par avance le nombre d'éléments à stocker dans le tableau. Par exemple si ces éléments figurent dans un fichier texte qui peut être modifié en dehors du programme, on lira une fois le ficheir en comptant par exemple chaque ligne, puis on fera un Setlength(Nombre_De_Lignes) qui déterminera un tableau strictement approprié au nombre d'éléments qu'il a à stocker.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 12/10/2014, 15h18
  2. Tableau Dynamique pointant sur Tableau Statiques
    Par ShaiLeTroll dans le forum Langage
    Réponses: 15
    Dernier message: 16/11/2009, 14h56
  3. [Tableau] Initialisation d'un tableau dynamique
    Par Rayek dans le forum Langage
    Réponses: 4
    Dernier message: 28/11/2007, 08h24
  4. Redimensionner un tableau dynamique
    Par WebPac dans le forum Delphi
    Réponses: 6
    Dernier message: 18/01/2007, 16h23
  5. Comment redimensionner un tableau dynamique ?
    Par Mickey.jet dans le forum Langage
    Réponses: 13
    Dernier message: 07/09/2006, 18h16

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