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 :

[LG]traduire ReDim de VB


Sujet :

Langage Pascal

  1. #1
    Membre du Club Avatar de James64
    Profil pro
    Inscrit en
    Février 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 99
    Points : 49
    Points
    49
    Par défaut [LG]traduire ReDim de VB
    Bonjour,

    Je cherche une fonction équivalente au ReDim de VB

    Merci

  2. #2
    Nouveau membre du Club
    Inscrit en
    Octobre 2003
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 26
    Points : 29
    Points
    29
    Par défaut utilise getmem
    je crois que tu dois utiliser les pointeurs, Getmem et sizeof...
    fais un tour dans l'aide pour plus d'infos. revient si tu pige pas...


  3. #3
    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 !

    Pour Windows et DPMI existent les fonctions GlobalReAlloc et GlobalReAllocPtr.

    Mais pour DOS en mode réel :

    - Solution de très loin la plus simple :

    1. Utilise les routines d'allocation de variables dynamiques New ou GetMem pour allouer une variable de taille différente;
    2. Transfère tes données vers la nouvelle variable;
    3. Détruis l'ancienne variable.

    - Solution "exotique" :

    Il existe plus que certainement des gestionnaires du tas concurrents de ceux fournis avec Turbo Pascal - et plus puissants, avec notamment possibilité de redimensionner les variables dynamiques. Certains membres de ce forum en ont peut-être déjà programmé et ne manqueront pas de réagir...
    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]

  4. #4
    Membre du Club Avatar de James64
    Profil pro
    Inscrit en
    Février 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 99
    Points : 49
    Points
    49
    Par défaut
    Merci, l'histoire du GetMem est résolu.
    J'ai vu aussi qu'on pouvait placer "preserve" juste aprés afin de ne pas modifier les valeurs antérieures du tableau. c bien ca?!

    par quoi est-il remplacer en pascal. G cherché, mais je ne trouve pas !


  5. #5
    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
    Vu qu'en Pascal il ne s'agit pas de la modification de la taille d'une variable dynamique mais plutôt de la création d'une autre variable, ce genre de directive n'a pas lieu d'être. Il incombe au programme de transférer les données de l'ancienne vers la nouvelle variable.
    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]

  6. #6
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    Le gestionnaire de mémoire de Turbo Pascal est malheureusement un peu limité, car il n'inclus pas de possibilité de retailler une variable dynamique alors que le Dos le permet. C'est à n'y rien comprendre...

    Plusieurs solutions sont à envisager.

    1. Se débrouiller avec les moyens du bord

    Pas le choix dans ce cas, créer une nouvelle variable, déplacer le contenu de l'ancienne dans celle-ci, et supprimer l'ancienne. C'est lent, peu pratique, et consomme deux fois plus de mémoire que nécessaire. Mais c'est simple à mettre en oeuvre.

    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
     
    var
      A, B: Pointer;
     
    begin
      GetMem(A, 1000); { On alloue 1000 octets à A }
      ...
      { On veut passer de 1000 à 2000 octets }
      GetMem(B, 2000); { On alloue une nouvelle variable }
      Move(A^, B^, 1000); { On recopie l'ancienne variable }
      FreeMem(A, 1000); { On supprime l'ancienne }
     
      A := B; { Facultatif : on choisit de garder A comme variable }
      ...
      FreeMem(A, 2000); { Ou B, si on a échangé le rôle de A et B }
    end;
    2. On revient à la source : Dos

    Le Dos permet de réallouer une variable. Ce n'est pas d'un pratique fou, car il faut réécrire toutes les procédures d'allocation mémoire, à l'aide de l'interruption 21h.
    De plus, Turbo Pascal, par défaut, alloue toute la mémoire disponible pour son propre tas. Il faut donc limiter ses ardeurs avec la directive {$M Pile, TasMin, TasMax}

    Je ne mets pas de code ici, il faut avoir un peu d'expérience en programmation système pour bien comprendre, et je ne susi pas sûr que ça serve vraiment.

    3. On change totalement de stratégie

    On utilise des listes chaînées à la place de tableaux par exemple. Les listes chaînées permettent de supprimer des élément et d'en rajouter autant que la mémoire le permet. Elles sont extrêment pratiques... une fois que l'on a su écrire le code les gérant !

    Je t'engage alors à regarder l'unité Lists.pas...

    A+


    Remarque: Pour Windows et le mode protégé (DPMI), la réponse d'Alcatîz est nickel
    Règles du forum
    F.A.Q Pascal

    Pour me joindre (aucune question technique, merci)

Discussions similaires

  1. [Entité-Association] Traduire l'héritage conceptuel en script BDD
    Par MrEddy dans le forum Schéma
    Réponses: 2
    Dernier message: 16/03/2004, 15h18
  2. [merise]traduire en sql une association réflexive
    Par omega dans le forum Langage SQL
    Réponses: 2
    Dernier message: 11/03/2004, 18h10
  3. [VB6] Erreur 9 sur redim preserve
    Par tomnie dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 22/10/2002, 17h29
  4. Traduire du DSP pour ADSP2181 de Analog Devices en C
    Par Aramis dans le forum Autres architectures
    Réponses: 4
    Dernier message: 14/06/2002, 12h03

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