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

Turbo Pascal Discussion :

Allocateur de chaînes de caractères


Sujet :

Turbo Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 21
    Par défaut Allocateur de chaînes de caractères
    Bonsoir,

    il y a quelques semaines, mon prof mentionnait la création d'un allocateur spécialisé pour les chaînes de caractères afin d'éviter le dépassement de tas lors d'un tri par hachage.
    En partant sur cette base, il me semble que l'on devait mettre les chaînes dans un enregistrement afin d'allouer au gré de nos besoins.

    De ce fait, si j'ai une liste sur le type String, ses cellules ne contiendront plus directement 256 octets mais seulement l'adresse menant à la chaîne stockée dans le record.

    Ce devrait ressembler à quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      Allocateur = array [1..32000] of ^String;
      Alloc =
        record
           t : Allocateur;
           k : integer;
        end;
     
    var maVar : Alloc.
    Besoin de stocker une chaîne ? Boum !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    New(maVar.t[i]);
    maVar.t[i] := chaine;
    Quelqu'un peut-il affirmer ou infirmer ce que j'avance et me donner davantage d'informations svp puisque j'aimerais le coder ?

    Merci d'avance pour vos réponses.

    Cordialement,

    Aragog.

  2. #2
    Responsable Pascal, Lazarus et Assembleur


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

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

    Informations forums :
    Inscription : Mars 2003
    Messages : 8 049
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Je pense que le bât blesse au niveau de la taille du segment de données et de la taille maximale d'une variable.
    Plutôt qu'un tableau de pointeurs vers des chaînes de caractères stockées dans le tas, tu pourrais utiliser une liste chaînée ?

    S'il s'agit d'économiser de l'espace, l'utilisation des chaînes à zéro terminal au lieu du type String serait peut-être plus indiquée. Si tu veux avoir un aperçu de la gestion de ce type de chaînes : http://alcatiz.developpez.com/tutoriel/owl/?page=pg_azt (c'est un autre compilateur mais c'est compatible avec l'unité Strings de Turbo Pascal 7). La fin de la page traite de l'allocation dynamique des chaînes à zéro terminal.

    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 21
    Par défaut
    J'utilise déjà une liste dynamique simplement chaînée.

    Et malheureusement, je suis trop peu à l'aise avec cette notion de chaînes à zéro terminal pour pouvoir l'inclure dans toute ma structure.
    Mais je comprends aisément pourquoi le tas explose, en effet, chaque cellule de ma liste peuvent contenir (entre autres qui plus est) 3 chaînes de 256 octets chacune donc lors du tri par hachage, ça ne fonctionne plus trop trop bien.

    Merci quand même pour votre aide.

  4. #4
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    moi je verrais bien ceci

    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
     
    type
      PString = ^string;
     
    function AllocString(Len: Integer):PString;
    var
      S: PString;
    begin
      GetMem(S, Len + 1);
      AllocString := S;
    end;
     
    var
      S: PString;
    begin
      S := AllocString(5);
      S^ := 'Hello';
    end;
    ou encore

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    function AllocString(const s: string): PString;
    var
      p: PString;
    begin
      GetMem(p, Length(s) + 1);
      p^ := s;
      AllocString := p;
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 21
    Par défaut
    Ah oui en effet, je comprend ici tout l'avantage d'une telle méthode, on ne gâche aucune mémoire, merci beaucoup, je vais essayer de suite sur mon programme et je vois si j'arrive à mettre tout ça en œuvre.

    Cependant une question sûrement très bête, vous marquez car vous n'oubliez pas la taille de la chaîne stockée en s[0], c'est ça ?

  6. #6
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Citation Envoyé par aragog Voir le message
    Ah oui en effet, je comprend ici tout l'avantage d'une telle méthode, on ne gâche aucune mémoire, merci beaucoup, je vais essayer de suite sur mon programme et je vois si j'arrive à mettre tout ça en œuvre.

    Cependant une question sûrement très bête, vous marquez car vous n'oubliez pas la taille de la chaîne stockée en s[0], c'est ça ?
    tout à fait...note que depuis Dephi 2 les strings sont déjà des zones mémoires allouées dynamiquement sans qu'on ai besoin de s'en soucier
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  2. Réponses: 2
    Dernier message: 18/10/2003, 14h42
  3. Chaînes de caractères
    Par Zazeglu dans le forum C
    Réponses: 3
    Dernier message: 28/08/2003, 16h20
  4. Inverser une chaîne de caractères
    Par DBBB dans le forum Assembleur
    Réponses: 2
    Dernier message: 30/03/2003, 11h09
  5. Réponses: 3
    Dernier message: 09/05/2002, 01h39

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