Précédent   Forum du club des développeurs et IT Pro > Autres langages > Pascal > Langage
Langage Vos questions sur langage Pascal en général, ses évolutions, les technologies, ...
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 13/06/2011, 20h02   #1
Younes Ch
 
Homme
Inscription : mai 2011
Messages : 24
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Algérie

Informations forums :
Inscription : mai 2011
Messages : 24
Points : -11
Points : -11
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 ?
Younes Ch est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2011, 07h28   #2
Alcatîz
Responsable Pascal

 
Avatar de Alcatîz
 
Homme Jean-Luc Gofflot
Ressources humaines
Inscription : mars 2003
Messages : 5 513
Détails du profil
Informations personnelles :
Nom : Homme Jean-Luc Gofflot
Âge : 46
Localisation : Belgique

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

Informations forums :
Inscription : mars 2003
Messages : 5 513
Points : 39 399
Points : 39 399
Envoyer un message via ICQ à Alcatîz Envoyer un message via MSN à Alcatîz Envoyer un message via Yahoo à Alcatîz Envoyer un message via Skype™ à Alcatîz
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]
Alcatîz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2011, 10h09   #3
Paul TOTH
Expert Confirmé Sénior
 
Avatar de Paul TOTH
 
Homme Paul TOTH
Freelance
Inscription : novembre 2002
Messages : 4 432
Détails du profil
Informations personnelles :
Nom : Homme Paul TOTH
Âge : 43
Localisation : Réunion

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

Informations forums :
Inscription : novembre 2002
Messages : 4 432
Points : 10 856
Points : 10 856
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%
Paul TOTH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2011, 12h16   #4
Younes Ch
 
Homme
Inscription : mai 2011
Messages : 24
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Algérie

Informations forums :
Inscription : mai 2011
Messages : 24
Points : -11
Points : -11
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
Citation:
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
Citation:
p^:=5;
..
le deuxième problème c'est :
une variable de type pointeur occupe 4 octet
c'est on fait
Citation:
p:=nil;
est ce qu'elle occupe 4 octet ou bien 0 octet ?

et merci encore pour vos réponses
Younes Ch est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2011, 12h51   #5
Alcatîz
Responsable Pascal

 
Avatar de Alcatîz
 
Homme Jean-Luc Gofflot
Ressources humaines
Inscription : mars 2003
Messages : 5 513
Détails du profil
Informations personnelles :
Nom : Homme Jean-Luc Gofflot
Âge : 46
Localisation : Belgique

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

Informations forums :
Inscription : mars 2003
Messages : 5 513
Points : 39 399
Points : 39 399
Envoyer un message via ICQ à Alcatîz Envoyer un message via MSN à Alcatîz Envoyer un message via Yahoo à Alcatîz Envoyer un message via Skype™ à Alcatîz
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]
Alcatîz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2011, 13h15   #6
Paul TOTH
Expert Confirmé Sénior
 
Avatar de Paul TOTH
 
Homme Paul TOTH
Freelance
Inscription : novembre 2002
Messages : 4 432
Détails du profil
Informations personnelles :
Nom : Homme Paul TOTH
Âge : 43
Localisation : Réunion

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

Informations forums :
Inscription : novembre 2002
Messages : 4 432
Points : 10 856
Points : 10 856
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%
Paul TOTH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2011, 13h55   #7
Younes Ch
 
Homme
Inscription : mai 2011
Messages : 24
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Algérie

Informations forums :
Inscription : mai 2011
Messages : 24
Points : -11
Points : -11
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
Younes Ch est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2011, 14h46   #8
Paul TOTH
Expert Confirmé Sénior
 
Avatar de Paul TOTH
 
Homme Paul TOTH
Freelance
Inscription : novembre 2002
Messages : 4 432
Détails du profil
Informations personnelles :
Nom : Homme Paul TOTH
Âge : 43
Localisation : Réunion

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

Informations forums :
Inscription : novembre 2002
Messages : 4 432
Points : 10 856
Points : 10 856
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%
Paul TOTH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2011, 14h47   #9
Modulpro
Membre habitué
 
Avatar de Modulpro
 
Homme Emilien
Étudiant
Inscription : octobre 2010
Messages : 69
Détails du profil
Informations personnelles :
Nom : Homme Emilien
Âge : 19
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : octobre 2010
Messages : 69
Points : 146
Points : 146
Citation:
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"
Modulpro est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 17h29.


 
 
 
 
Partenaires

Hébergement Web