Autor Beitrag
delphisual
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 89

WIN 2000
D5 Prof
BeitragVerfasst: Mi 09.07.03 16:00 
Hallo und danke für das Reinschauen,

1. ich habe eine Frage die mich beschäftigt, den überall lese ich, dass der Pointer einen Speicher von 4 Byte benötigt, durch die Procedure New() erzeuge ich eine dynamische Variable die genau so groß ist wie der Datentyp auf dem ich referenziere. ich habe einfache Pointer ausprobiert und es funktioniert ohne der Eingabe von NEW(Pointer), also wann genau muss ich die procedure New(Pointer) einsetzen?
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
var P : ^integer;  // Der Zeiger wird nicht Typisiert
    B : integer;
  Form1: TForm1;

implementation

{$R *.DFM}



procedure TForm1.Button1Click(Sender: TObject);
begin
    B:=100;
    P:= @B;  // Die Adresse mitteilen,
    label1.Caption:=Format('Wert von P: %d',[(P^)]); //Vor der ausgabe muss man  den  Pointer Typisieren.
end;

funktioniert
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
var P : ^integer;  // Der Zeiger wird nicht Typisiert
    B : integer;
  Form1: TForm1;

implementation

{$R *.DFM}



procedure TForm1.Button1Click(Sender: TObject);
begin
    new(P);  // Bitte sagt mir was sich jetzt geändert hatt
    B:=100;
    P:= @B;  // Die Adresse mitteilen,
    label1.Caption:=Format('Wert von P: %d',[(P^)]); //Vor der ausgabe muss man  den  Pointer Typisieren.
end;

funktioniert auch !

ich freue mich auf jede Antwort! DANKE!!!!!!!!!

_________________
(Wer ein Problem definiert, hat es schon halb gelöst.)
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Mi 09.07.03 16:07 
Hallo,

in deinem Beispiel reserviest du den Speicher nich per New sondern über das
ausblenden Delphi-Quelltext
1:
VAR B : Integer					

Dein Pointer referenziert dann nur den Speicher, der durch die obrige Variablemdeklaration Reserviert wurde.
Wenn du New verwendest kannst du auf die Deklatation von B verzichten.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
var P : ^integer;  // Der Zeiger ist Typisiert auf Integer
  Form1: TForm1; 

implementation 

{$R *.DFM} 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
  NEW(P); // Speicher Reservieren
  TRY
     p^:=100// Einen Wert in den Reservierten Speicher schreiben
     label1.Caption:=Format('Wert von P: %d',[(P^)]); //Den Inhalt der Speicheradresse auf die P Zeigt Ausgeben.
  FINALLY
    Dispose(p); // Den Dynamisch Reservierten Speicher wieder frei geben
  END// TRY FINALLY
end;


Gruß
Klabautermann
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Mi 09.07.03 16:07 
delphisual hat folgendes geschrieben:
Typisiert

Es heißt dereferenzieren.

Zitat:
new(P); // Bitte sagt mir was sich jetzt geändert hatt

Du hast ein Speicherleck von 4 Bytes geschaffen.


Mit New(P) reservierst du Speicher auf den der Zeiger P danach zeigt. Diesen Speicher musst du mit Dispose(P) wieder freigeben.
Anstatt dem
ausblenden Delphi-Quelltext
1:
New(P);					

kannst du auch
ausblenden Delphi-Quelltext
1:
GetMem(P, SizeOf(Integer));					

schreiben. Dann solltest du statt Dispose(P) aber FreeMem(P) aufrufen.


Für deinen Code ist der New-Aufruf nutzlos, da du den Zeiger mit P := @B auf den Speicherbereich an dem B liegt umbiegst. Der alte Wert, der von New zugewiesen wurde, geht verloren.

New() und Dispose() werden häufig bei verketteten Listen eingesetzt, wo man nicht weiß wieviel Elemente noch kommen können.

_________________
Ist Zeit wirklich Geld?
delphisual Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 89

WIN 2000
D5 Prof
BeitragVerfasst: Mi 09.07.03 16:51 
genau das wollte ich wissen, danke, danke, danke :D

_________________
(Wer ein Problem definiert, hat es schon halb gelöst.)