Wo ist mein Handle hin von einer Proc zur nächsten?

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
alfware17
Beiträge: 228
Registriert: Di 14. Dez 2010, 23:27

Wo ist mein Handle hin von einer Proc zur nächsten?

Beitrag von alfware17 »

Ich steh ein wenig auf dem Schlauch beim Abbruch meines folgenden Codes (das komplette Beispiel im Anhang)

Meine Deutung: der Handle (meine eigene StrList) geht auf dem Weg von SortHandle zu SchreibenDatei irgendwo verloren.
Jedenfalls sagt der Debugger wenn ich über der kommentierten Stelle stehe, für TStrListe(Handle^) schon mal eine ganz andere Adresse
als bei den anderen show Stellen und wahrscheinlich schlägt dann auch deswegen der Zugriff spätestens bei CurrValOf fehl.

Aber warum??? Ich habe doch nichts anderes gemacht als bei Unit1 und Unit2 und Unit3? Ich kann innerhalb SortHandle
die StrList sooft ausgeben wie ich will (mit show), die ist intakt, solange bis sie die Prozedur SortHandle verläßt. Muß
der Parameter bei SortHandle VAR Handle sein? Aber es ist doch ein Pointer. Und bei Unit1, Unit2 und Unit3 hat es funktioniert?

Mein Sort habe ich deaktiviert, das hat keinen Einfluß wenn ich es wieder aktiviere, gehen die show in SortHandle genauso und
das in SchreibenDatei nicht mehr. Ich habe es nur deshalb deaktiviert weil es (das Sort) den Head verändert und ich wollte
Nebeneffekte ausschließen. Aber alle show nach dem Sort sind trotzdem erfolgreich.


Code: Alles auswählen

unit Unit4;

interface
uses SysUtils, IVerfahren, OptIO, StrList;

procedure LesenDatei(const Dateiname: string; out Handle: TStrukturHandle);
procedure SortHandle(Handle: TStrukturHandle);
procedure SchreibenDatei(const Dateiname: string; Handle: TStrukturHandle);
procedure FreeHandle(var Handle: TStrukturHandle);

implementation

procedure LesenDatei(const Dateiname: string; out Handle: TStrukturHandle);
var L: TStrListe;
begin
  L.Init;
  ReadOptToStringList(Dateiname, L);
  Handle := @L;
  Writeln('Nach LesenDatei');
  TStrListe(Handle^).show;
  Writeln('fertig');
end;

procedure SortHandle(Handle: TStrukturHandle);
begin
  Writeln('Vor Sort');
  TStrListe(Handle^).show;
  Writeln('fertig');
  // TStrListe(Handle^).Sort;
  Writeln('Nach Sort');
  TStrListe(Handle^).show;
  Writeln('fertig');
  Writeln('Und nochmal');
  TStrListe(Handle^).show;
  Writeln('fertig');
  Writeln('Und Nochmal');
  TStrListe(Handle^).show;
  Writeln('fertig');
end;

procedure SchreibenDatei(const Dateiname: string; Handle: TStrukturHandle);
begin
  Writeln('Vor Schreiben');
  TStrListe(Handle^).show;  //bricht ab, anscheinend ist die Liste weg?
  Writeln('fertig');
  SaveOptFromStringList(Dateiname, TStrListe(Handle^));
end;

procedure FreeHandle(var Handle: TStrukturHandle);
begin
  TStrListe(Handle^).Free;
  Handle := nil;
end;

end.                                                                                                    
Dateianhänge
PSort.zip
(1.68 MiB) 17-mal heruntergeladen

Benutzeravatar
Zvoni
Beiträge: 450
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: Wo ist mein Handle hin von einer Proc zur nächsten?

Beitrag von Zvoni »

Kann es sein, dass du Pointer to Pointer bekommst?

ich sehe ein
Handle:=@L;
Handle ist aber ein out-param, also ist schon von Haus aus ein Pointer

Hab jetzt aber nicht in den Quellcode geschaut
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Benutzeravatar
theo
Beiträge: 11007
Registriert: Mo 11. Sep 2006, 19:01

Re: Wo ist mein Handle hin von einer Proc zur nächsten?

Beitrag von theo »

Hab's nicht alles angeschaut, aber deine TStrListe ist ja ein Object (TStrListe = OBJECT)
Das findet auf dem Stack statt und daher ist wahrscheinlich dein L ausserhalb der Prozedur nicht mehr da (kein Speicherplatz mehr reserviert).

Code: Alles auswählen

procedure LesenDatei(const Dateiname: string; out Handle: TStrukturHandle);
var L: TStrListe;
https://wiki.freepascal.org/Object

Wenn es eine Klasse wäre (Heap), wäre es bis zum "Free" brauchbar.
Mit Object scheint auch "New" zu funktionieren, aber da stellt sich die Frage, warum man nicht gleich eine Klasse nimmt.

Warum brauchst du da überhaupt Pointer?

alfware17
Beiträge: 228
Registriert: Di 14. Dez 2010, 23:27

Re: Wo ist mein Handle hin von einer Proc zur nächsten?

Beitrag von alfware17 »

Theo hat recht..Meine Stringliste gehört der Prozedur und war nur durvh Glück beim Sortieren noch sichtbar. Beim Schreiben dann nicht mehr. Ich habe sie auf den heap.gelegz

Nun geht's

Und die Pointer brauche ich weil ich vier verschiedene Datenstrukturen testen will also nicht nur diese Stringliste sondern auch noch drei andere

Antworten