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 Pascal Discussion :

Copie dynamique de chaîne


Sujet :

Langage Pascal

  1. #1
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Copie dynamique de chaîne
    Bonjour,

    Je cherche à reproduire la fonction strdup() du C. Ce code est-il correct ?
    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
    19
    20
    21
    22
     
    program snippet;
     
     procedure main;
     var
      sdup : ^string;
      s : string;
     begin
      s := "Hello word";
      new (sdup, 1 + length(s));
      sdup^ := s;
     
      writeln (s);
      writeln (sdup^);
      dispose (sdup);
     
     end;
     
    begin
     main;
     readln;
    end.
    Merci :

    P.S. new/dispose sont-ils mieux que getmem()/freemem() ?
    Pas de Wi-Fi à la maison : CPL

  2. #2
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    A priori, le code est bon et devrait compiler. Sémantiquement c'est correct en tout cas.

    New et Dispose sont plutôt utilisé pour la programmation objet, sachant qu'avec new on alloue l'espace mémoire du pointeur passé en paramètre sans gérer la taille (le choix est laissé au compilateur, qui alloue la bonne taille). Avec getmem, on réserve un espace de mémoire, et on y met ce qu'on veut dedans. Ce n'est pas tout à fait pareil. getmem est plus fin pour gérer l'espace mémoire.

    Dans ton cas, si on voulait optimiser, on aurait choisi getmem : en récupérant la taille de la string à copier, on alloue un espace de même taille + 1, puis on copie octet par octet. Avec new, tu vas allouer 256 octets, alors que tous ne sont pas utiles, si ta chaîne à copier fait 10 octets
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  3. #3
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par wormful_sickfoot
    Dans ton cas, si on voulait optimiser, on aurait choisi getmem : en récupérant la taille de la string à copier, on alloue un espace de même taille + 1, puis on copie octet par octet. Avec new, tu vas allouer 256 octets, alors que tous ne sont pas utiles, si ta chaîne à copier fait 10 octets
    Ca veut dire que le 2ème paramètre ne sert à rien ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     var
      sdup : ^string;
      s : string;
     begin
      s := "Hello word";
      new (sdup, 1 + length(s));
    si je ne le met pas, le compilateur me dit qu'il ne sait pas faire... Je rappelle que sdup est un ^string et non un string.
    Pas de Wi-Fi à la maison : CPL

  4. #4
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Bizarre, sans le deuxième paramètre, ca compile chez moi.

    Voici la version avec getmem, plus logique à mon goût :

    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
    19
    20
    21
    22
     
    program snippet;
     
     procedure main;
     var
      sdup : ^string;
      s : string;
     begin
      s := 'Hello word';
      getmem (sdup, length(s) + 1);
      sdup^ := s;
     
      writeln (s);
      writeln (sdup^);
      freemem (sdup, length(s) + 1);
     
     end;
     
    begin
     main;
     readln;
    end.
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  5. #5
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par wormful_sickfoot
    Bizarre, sans le deuxième paramètre, ca compile chez moi.
    J'utilise GNUPascal.

    Voici la version avec getmem, plus logique à mon goût :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      getmem (sdup, length(s) + 1);
    <...>
      freemem (sdup, length(s) + 1);
    OK, mais il faut se trimballer la taille pour la libération. C'est pas drôle...

    Exceptionnellement, ici, je peux faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      freemem (sdup, length(sdup) + 1);
    mais c'est un cas très particulier...

    En tout cas, merci, je vais continuer à étudier tout ça.
    Pas de Wi-Fi à la maison : CPL

  6. #6
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 938
    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 938
    Points : 59 417
    Points
    59 417
    Billets dans le blog
    2
    Par défaut
    Bonjour !

    Les chaînes AZT (tableaux de caractères et pChar) du Pascal sont plus proches du C que les chaînes à attribut de longueur (strings).
    A ce sujet, encore un peu de pub pour la nouvelle FAQ :
    http://pascal.developpez.com/faq/?pa...-zero-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]

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 17/02/2012, 16h24
  2. Variable dynamique de chaînes
    Par Mugen RX dans le forum wxPython
    Réponses: 0
    Dernier message: 19/02/2010, 13h17
  3. tableau dynamique de chaînes de caractères
    Par Vorona dans le forum Débuter
    Réponses: 5
    Dernier message: 17/05/2009, 19h05
  4. Créer dynamiquement une chaîne formatée
    Par Haze. dans le forum C
    Réponses: 12
    Dernier message: 28/12/2007, 03h19
  5. allocation dynamique de chaîne
    Par gauguin dans le forum C
    Réponses: 12
    Dernier message: 17/02/2007, 10h38

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