Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 9 sur 9
  1. #1

    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 : -10
    Points
    -10

    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, Delphi et Assembleur

    Avatar de Alcatîz
    Homme Profil pro Jean-Luc Gofflot
    Ressources humaines
    Inscrit en
    mars 2003
    Messages
    6 179
    Détails du profil
    Informations personnelles :
    Nom : Homme Jean-Luc Gofflot
    Âge : 48
    Localisation : Belgique

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

    Informations forums :
    Inscription : mars 2003
    Messages : 6 179
    Points : 40 855
    Points
    40 855

    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 :
    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
    Tutoriels, exercices, FAQ, sources, compilateurs, outils, livres Pascal
    Mes tutoriels et sources Pascal
    FAQ Assembleur

    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]

  3. #3
    Expert Confirmé Sénior
    Avatar de Paul TOTH
    Homme Profil pro Paul TOTH
    Freelance
    Inscrit en
    novembre 2002
    Messages
    5 569
    Détails du profil
    Informations personnelles :
    Nom : Homme Paul TOTH
    Âge : 45
    Localisation : Réunion

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

    Informations forums :
    Inscription : novembre 2002
    Messages : 5 569
    Points : 15 926
    Points
    15 926

    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 :
    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 :
    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
    Produits : UPnP, RemoteOffice, FlashPascal
    Embarcadero : Ile de la Réunion, Dephi, C++Builder, RADPHP...TVA à 8,5%

  4. #4

    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 : -10
    Points
    -10

    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, Delphi et Assembleur

    Avatar de Alcatîz
    Homme Profil pro Jean-Luc Gofflot
    Ressources humaines
    Inscrit en
    mars 2003
    Messages
    6 179
    Détails du profil
    Informations personnelles :
    Nom : Homme Jean-Luc Gofflot
    Âge : 48
    Localisation : Belgique

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

    Informations forums :
    Inscription : mars 2003
    Messages : 6 179
    Points : 40 855
    Points
    40 855

    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
    Tutoriels, exercices, FAQ, sources, compilateurs, outils, livres Pascal
    Mes tutoriels et sources Pascal
    FAQ Assembleur

    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]

  6. #6
    Expert Confirmé Sénior
    Avatar de Paul TOTH
    Homme Profil pro Paul TOTH
    Freelance
    Inscrit en
    novembre 2002
    Messages
    5 569
    Détails du profil
    Informations personnelles :
    Nom : Homme Paul TOTH
    Âge : 45
    Localisation : Réunion

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

    Informations forums :
    Inscription : novembre 2002
    Messages : 5 569
    Points : 15 926
    Points
    15 926

    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
    Produits : UPnP, RemoteOffice, FlashPascal
    Embarcadero : Ile de la Réunion, Dephi, C++Builder, RADPHP...TVA à 8,5%

  7. #7

    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 : -10
    Points
    -10

    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 Confirmé Sénior
    Avatar de Paul TOTH
    Homme Profil pro Paul TOTH
    Freelance
    Inscrit en
    novembre 2002
    Messages
    5 569
    Détails du profil
    Informations personnelles :
    Nom : Homme Paul TOTH
    Âge : 45
    Localisation : Réunion

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

    Informations forums :
    Inscription : novembre 2002
    Messages : 5 569
    Points : 15 926
    Points
    15 926

    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 :
    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
    Produits : UPnP, RemoteOffice, FlashPascal
    Embarcadero : Ile de la Réunion, Dephi, C++Builder, RADPHP...TVA à 8,5%

  9. #9
    Membre habitué Avatar de Modulpro
    Homme Profil pro Emilien
    Étudiant
    Inscrit en
    octobre 2010
    Messages
    73
    Détails du profil
    Informations personnelles :
    Nom : Homme Emilien
    Âge : 21
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : octobre 2010
    Messages : 73
    Points : 145
    Points
    145

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •