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 :

A quoi sert la procédure new ?


Sujet :

Langage Pascal

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations forums :
    Inscription : Mai 2011
    Messages : 24
    Points : 0
    Points
    0
    Par défaut A quoi sert la procédure new ?
    Salut tout le monde ,

    Je n'ai pas compris à quoi sert la procedure new sur Pascal, parce que les pointeurs je vois qu'il sont automatiquement alloués sans "new" !
    Deuxièmement , si je veux libérer une case mémoire je vais utiliser freemem ou bien dispose ?
    La dernière question : si un pointeur est nil, il n'occupe aucun bit ?

  2. #2
    Responsable Pascal, Lazarus et Assembleur


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

    Les pointeurs sont déclarés comme variables, pas alloués automatiquement. Qu'ils aient la valeur nil ou toute autre valeur, la variable a la même taille.

    New alloue un bloc de mémoire dans le tas, de la taille du type pointé par le pointeur qui lui est transmis, et renvoie l'adresse du bloc dans le pointeur. GetMem alloue un bloc de mémoire dans le tas, de la taille qui lui est explicitement transmise.

    Habituellement, on utilise Dispose pour désallouer une variable allouée par New et FreeMem pour désallouer une variable allouée par GetMem.

    Exemple :
    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
    23
    24
    Type
      PTableau = ^TTableau;
      TTableau = Array [1..10] of Integer;
     
    Var
      p1 : PTableau;
      p2 : Pointer;
     
    Begin
     
      New(p1);
      (* Un bloc de la taille du tableau est alloué et son adresse est renvoyée dans p1 *)
     
      Dispose(p1);
      (* Le tableau pointé par p1 est désalloué *)
     
     
      GetMem(p2,SizeOf(TTableau));
      (* Un bloc de la taille du tableau est alloué et son adresse est renvoyée dans p2 *)
     
      FreeMem(p2,SizeOf(TTableau));
      (* Le bloc pointé par p2 est désalloué *)
     
    End.
    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
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    Citation Envoyé par Younes Ch Voir le message
    Salut tout le monde ,

    Je n'ai pas compris à quoi sert la procedure new sur Pascal, parce que les pointeurs je vois qu'il sont automatiquement alloués sans "new" !
    Deuxièmement , si je veux libérer une case mémoire je vais utiliser freemem ou bien dispose ?
    La dernière question : si un pointeur est nil, il n'occupe aucun bit ?
    La réponse donnée ci-dessus est juste, mais peux-tu expliquer ce que tu entends pas "alloué automatiquement" ?

    un pointeur occupe toujours 4 octets (en 32 bits), et il contient une adresse mémoire. "nil" est simplement la valeur 0.

    si l'adresse mémoire stockée dans le pointeur est celle d'une variable statique, il n'y a pas d'allocation supplémentaire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var
     p: Pointer;
     i : Integer;
    begin
      p := @i;
    end;
    si tu utilises GetMem, une portion de mémoire libre dans le "tas" (heap) est allouée et son adresse est stockée dans le pointeur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    var 
     p: Pointer;
    begin
      // p est indéfini, sa valeur ne DOIT pas être utilisée
      GetMem(p, 1024);
      // p contient maintenant l'adresse d'un bloc de 1024 octets qui lui sont alloués
      FreeMem(p); 
      // p possède toujours la même adresse, mais celle-ci n'est plus réservée à son usage !
      p := nil;
      // p contient maintenant 0, ça permet de savoir qu'il est vide, c'est tout
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations forums :
    Inscription : Mai 2011
    Messages : 24
    Points : 0
    Points
    0
    Par défaut
    merci bien mais j'ai pas trouver ce que je cherche dans vos réponses !
    je vais expliquer mieux mon problème
    en langage algorithmique on a l'habitude a a faire ça
    allouer(p);
    p^:=5;
    mais on pascal c'est allouer automatique je pense parce qu'on a pas besoin d'ajouter l'instruction new donc il nous suffit de faire ça
    p^:=5;
    ..
    le deuxième problème c'est :
    une variable de type pointeur occupe 4 octet
    c'est on fait
    p:=nil;
    est ce qu'elle occupe 4 octet ou bien 0 octet ?

    et merci encore pour vos réponses

  5. #5
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 930
    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 930
    Points : 59 398
    Points
    59 398
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Younes Ch Voir le message
    mais on pascal c'est allouer automatique je pense parce qu'on a pas besoin d'ajouter l'instruction new donc il nous suffit de faire ça
    Ca, c'est le crash assuré à très court terme pour ton application.
    Si tu n'alloues pas de variable dynamique, le pointeur p contient une adresse indéfinie et tu vas aller écrire la valeur 5 n'importe où en mémoire.

    Citation Envoyé par Younes Ch Voir le message
    le deuxième problème c'est :
    une variable de type pointeur occupe 4 octet
    c'est on fait
    est ce qu'elle occupe 4 octet ou bien 0 octet ?
    4 octets, la taille du type pointeur.
    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
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    Citation Envoyé par Younes Ch Voir le message
    merci bien mais j'ai pas trouver ce que je cherche dans vos réponses !
    je vais expliquer mieux mon problème
    en langage algorithmique on a l'habitude a a faire ça

    mais on pascal c'est allouer automatique je pense parce qu'on a pas besoin d'ajouter l'instruction new donc il nous suffit de faire ça
    C'est juste faux

    Citation Envoyé par Younes Ch Voir le message
    le deuxième problème c'est :
    une variable de type pointeur occupe 4 octet
    c'est on fait
    est ce qu'elle occupe 4 octet ou bien 0 octet ?

    et merci encore pour vos réponses
    tu n'as pas lu nos réponses, un pointeur c'est TOUJOURS 4 octets, il contient soit une adresse (valide ou pas) soit 0 qui est noté "nil" dans le cas des pointeurs.

    soit un entier "i : Integer" il occupera toujours 4 octets, que sa valeur soit 10000 125 ou 0 ! un Pointeur c'est pareil.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations forums :
    Inscription : Mai 2011
    Messages : 24
    Points : 0
    Points
    0
    Par défaut
    donc il va réserver une place quelconque dans la memoire si je fais pas new,

    mais est ce que ça provoque un probleme ?
    je vois que non !!
    parce que je peux l'accéder lorsque je veux

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    Citation Envoyé par Younes Ch Voir le message
    donc il va réserver une place quelconque dans la memoire si je fais pas new,
    Non ! il ne va rien réserver du tout, et les ordinateurs ne connaissent pas "quelconque".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    var 
      p: ^Byte;
    begin
      // ici p a une valeur non déterminée...disons 48684
      p^ := 5;
      // place un 5 à l'adresse mémoire 48684
      // si c'est une adresse de code (sous Windows) plantage
      // si c'est une adresse invalide plantage
      // si c'est une adresse data, une zone de mémoire a été modifiée quelque part dans le programme
    end;
    Citation Envoyé par Younes Ch Voir le message
    mais est ce que ça provoque un probleme ?
    je vois que non !!
    parce que je peux l'accéder lorsque je veux
    peux-tu nous préciser, sur quelle OS, compilateur et donner un exemple de code ?
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  9. #9
    Membre habitué Avatar de Modulpro
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2010
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2010
    Messages : 76
    Points : 175
    Points
    175
    Par défaut
    mais est ce que ça provoque un probleme ?
    je vois que non !!
    parce que je peux l'accéder lorsque je veux
    Tu peux toujours y accéder, mais comme le pointeur n'était pas alloué, l’adresse qu'il contient est imprévisible, ainsi la mémoire sur laquelle tu écris ta valeur contenait peut-être déjà d'autres données qui sont alors effacées, d'ou le "crash assuré à très court terme"

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

Discussions similaires

  1. A quoi sert cette procédure?
    Par Basile le disciple dans le forum Débuter
    Réponses: 2
    Dernier message: 06/03/2015, 19h53
  2. A quoi sert les procédures stockées ?
    Par JediMaster dans le forum Linq
    Réponses: 4
    Dernier message: 18/05/2009, 22h14
  3. A quoi sert XML-Schema
    Par Community Management dans le forum Valider
    Réponses: 20
    Dernier message: 26/01/2009, 10h52
  4. [info] A quoi sert ImageObserver ?
    Par FrigoAcide dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 22/03/2004, 18h20

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