Autor Beitrag
hummel
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Di 31.05.05 17:33 
Hallo Leute, bin neuling und nicht sonderlich bewandert in sachen Programmierung.
Habe die Aufgabe bekommen, ein Pascalprogramm für Delphi umzuwandeln.
Die Aufgabe habe ich auch soweit gelöst, doch tauchen in Pascal die Begriffe "mark(heapzgr)" & "release(heapzgr)" auf.
Das Programm thematisiert "Dynamische Zeiger" Es werden also Daten in den Speicher geschriebn und dynamisch verwaltet.

"release(heapzgr)" soll wohl den Speicher wieder Freigeben. Bin aber wie erwähnt kein Experte.

Hier ist der Quelltext soweit ich den habe.

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  zeiger=^Elements;
  Elements=record
    Inhalt:Integer;
    next:zeiger;
  end;
  TForm1 = class(TForm)
    ListBox1: TListBox;
    Button1: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var kopf:zeiger;
    heapzgr:^integer;
  Form1: TForm1;

implementation

{$R *.dfm}

procedure Aufbau(liste:zeiger; i,anzahl:integer);
var p:zeiger;

        begin
        if i < anzahl then
                begin
                new(p);p^.Inhalt:=random(1000);liste^.next:=p;
                Aufbau(p,i+1,anzahl);
                end
        else liste^.next:=NIL;
end;                

procedure Ausgabe (I:Integer; P:zeiger);
begin
        if p <> NIL then
        begin
                Form1.Listbox1.items.add(inttostr(I)+inttostr(P^.inhalt));
                Ausgabe (I+1, P^.next);
        end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  {mark(heapzgr);}
  new(kopf);kopf^.Inhalt:=random(1000);
  aufbau(kopf,1,1000);
  ausgabe(1,kopf);
  {release(heapzgr);} 
  label1.Caption:='Momentan noch frei-->'+inttostr(getheapstatus.totalfree)+'Bytes';
end;

end.


Moderiert von user profile iconMotzi: Delphi-Tags hinzugefügt.
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Di 31.05.05 18:03 
ausblenden Delphi-Quelltext
1:
freemem(heapzgr);					

:wink:

ausblenden Delphi-Quelltext
1:
{mark(heapzgr);}					

kA lass einfach mal weg :wink:
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Di 31.05.05 18:17 
Oh, das ist alter Kode...
Ein 'Heap' ist ja ein Haufen. (engl: Heap = Haufen).
Mit Mark (X) merkt man sich die aktuelle Höhe des 'Haufens'... Anschliessend nimmt man sich mit new(p) immer mal wieder ein Stück Speicher weg. Anstatt nun alle Stückchen per dispose(p) wieder an die Speicherverwaltung zurückzugeben, hat man einfach per Release(X) alle Stückchen auf einmal wieder freigegeben.

Also mit new/dispose:

ausblenden Delphi-Quelltext
1:
2:
3:
  For i:=0 To 1000000 do New(p[i]);
....
  For i:=0 To 1000000 do Dispose (p[i]);


mit mark/release
ausblenden Delphi-Quelltext
1:
2:
3:
4:
  Mark (HeapPtr);
  For i:=0 To 1000000 do New(p[i]);
....
  Release (HeapPtr); // schmeisst alle Blöcke, die seit New reserviert worden, wieder weg.


Was F34r0fTh3D4rk aus Unwissenheit ('kA') vorschlug, war also völlig korrekt. :lol:
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Di 31.05.05 18:25 
LOL :D natürlich, hab doch immer recht :wink:


edit: meinst du das ernst ? :shock:
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Di 31.05.05 18:28 
Prrfffmmmmt :lol: Muhaaahaaa!
Wer macht jetzt meinen LCD wieder sauber? Da klebt überall das Feierabendbier...

edit: wat soll ick? Und, nenn mich nicht 'Ernst' :D


Zuletzt bearbeitet von alzaimar am Di 31.05.05 18:29, insgesamt 1-mal bearbeitet
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Di 31.05.05 18:28 
ich lieg auch unterm tisch, aber hab ich recht oder net :roll:

joah des funzt net, einfach mal weglassen, ja und hier ... :lol:
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Di 31.05.05 18:37 
Das er das 'mark/release' weglassen kann? Yep.
(Is ja nich mein Programm, he he).

Nee, nee. Im Ernst.... Mark/Release ist tod. Begraben. Ein EX-Befehl. Ein sogenannter 'Schrödinger' (benannt nach dem zukünftigen EX-Kandesbunz).
hummel Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Di 31.05.05 22:00 
Hey alzaimar, danke für die Hilfe, leider bin ich zu blöde um das Programm zum laufen zu bringen.
Könnte mal jemand den Sourcecode korekt umformen bzw. die nötige Änderung erledigen und komplett posten?

Wäre euch sehr bzw. demjenigen sehr dankbar.