Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Pointer zuweisen (https://www.delphipraxis.net/10473-pointer-zuweisen.html)

Florian H 19. Okt 2003 14:59


Pointer zuweisen
 
Hi,

wie kann ich einem Pointer einen anderen Pointer zuweisen?

ich habe sowas:
Delphi-Quellcode:
var
  pointer : ^ttest;
  list : TList;
begin
   new(pointer);
  list :=TList.Create;
  // ...[Einträge hinzufügen]...
  pointer := list.Items[0]; // !! EXCEPTION !!
  // ...[Freigeben etc]...
end;
Aber da bekomme ich dann immer einen Fehler...
Der Rückgabewert von list.items[0] ist ja "Pointer" ...


Kenne mich halt leider noch nicht so gut aus mit Zeigern und ich find auch nirgends was gescheites...

grüße
florian

Leuselator 19. Okt 2003 16:17

Re: Pointer zuweisen
 
Du erzeugst zwar die Liste, hast darin jedoch noch keine Einträge - also Pointer.
Als nextes versuchst Du auf das 1. Element der Liste zuzugreifen (was noch nicht existiert) und also "knallt" es.
Versuch mal so:
Delphi-Quellcode:
type
  TTest = Record // oder Object
    //irgendeinInhalt
  end;
  TTestZeiger = ^TTest;
var MeineListe : TList;
    MeinZeiger : TTestZeiger;
    i : Integer;
begin
  MeineListe := TList.Create;
  begin // while oder for - Schleife
    TList.Add(new(MeinZeiger)); // erzeugt Neues TTest-Object/Record/WasAuchImmer
                                // und liefert einen TTestZeiger zurück, der direct
                                // mit Add an's Ende der MeineListe gehangen wird
  end;
  // Wenn Du fertig bist, solltest Du nicht vergessen, MeineListe wieder freizugeben
  // und natürlich auch die Objecte , die Du mit new() erzeugt hast
  for i := MeineListe.Count-1 downto 0 do
  begin
    Dispose(TTestZeiger(MeineListe[i])); // gibt den für das i'te TTestObject reservierten  
                                         // Speicher frei
    MeineListe.Delete(i);               // gibt den Zeiger auf das nun schon nicht mehr
                                         // gültige i'te TTest-Object frei
  end;
  MeineListe.Free; // fertig!
end;

Mystic 19. Okt 2003 16:28

Re: Pointer zuweisen
 
Hallo Florian,

Wenn ein "Invalid Pointer Operation"-Fehler auftritt, hier die Lösung:

Die Exception tritt nicht beim Zuweisen, sondern beim Disposen von pointer auf.

Du darfst diesen Zeiger nicht mit New initialisieren. Damit kriegt der Zeiger seine eigene Variable. Wenn du einen Zeiger einem anderen Zeiger zuweist, 'verbiegst' du den anderen Zeiger, sodass er nicht mehr auf seine Variable sondern auf die Variable von ersterem Zeiger weist.

Wenn du dann die erste Variable (das Listitem) zerstörst und versuchst, pointer per dispose zu entfernen , hat die Dispose-Anweisung nichts mehr, das sie entfernen könnte und ruft einen "Invalid Pointer Operation"-Fehler hervor. Die alte Variable gurkt dann immer noch unnütz im Speicher rum (bis das Programm beendet wird).

Der Fehler verschwindet, wenn du die Zeile mit dem Zuweisen entfernst, da ja Dispose dann die Variable entfernen kann. Deswegen kann man den Eindruck haben, das es dort passiert.



MfG

Mystic

ArrayOf.. 19. Okt 2003 17:23

Re: Pointer zuweisen
 
Außerdem:

...sollte man eine Variable eigentlich nicht Pointer nennen, da es ja den gleichnamigen Typ auch schon gibt.

Variable die Pointer sind, haben dafür normalerweise dann in ihrem Namen ein großes P am Anfang, z.B.: PttestVar1

Wenn man schon einen Pointer auf Variable eines bestimmten Types (^ttest) definiert, dann sollte man ihn im Weiteren auch nur auf solche Variable (von diesem Typ) zeigen lassen. Denn sonst könnte man ja auch gleich den General-Pointer-Typ 'Pointer' nehmen.

Wenn man sich an solche Vereinbarungen hält schafft das zusätzlich Übersicht (hält man sich dann aber trotzdem nicht dran, allerdings auch das Gegenteil).

Florian H 19. Okt 2003 17:37

Re: Pointer zuweisen
 
Hi,

danke erstmal für eure Antworten.
Leider helfen sie mir alle nicht weitert....

@Leuselator: Mit dem " // ...[Einträge hinzufügen]..." meinte ich genau das, also dass ich ein paar Einträge hinzufüge...nur mache ich das in meinem code an einer anderen stelle und hab es so halt vereinfacht...

@Mystic: Ne, es ist eine stinknormale, nervige eAccessViolation :wall:

@ArrayOf..: ok, habs geändert, war aber bisher auch nur ein test, sonst bemühe ich mich auch immer, variablen "schön" zu benennen...

Mystic 19. Okt 2003 17:47

Re: Pointer zuweisen
 
Könntest du vielleicht den kompletten Quelltext veröffentlichen? Vielleicht offenbart sich ja dann das Problem.

ArrayOf.. 19. Okt 2003 17:58

Re: Pointer zuweisen
 
Also beim ersten Durchlauf gibt's bei mir eigentlich keine Exception. Beim zweiten allerdings schon und zwar weil du dann schlicht und einfach jetzt zum zweiten mal versuchst (was aber eben nur einmal geht) das in list.Items[0] gepointete Objekt freizugeben (unabhängig davon, dass man das bei Objekten ja eigentlich gar nicht mit 'Dispose' machen kann, sondern dazu das Free bzw. deren Destructor benötigt).

(das unter der Annahme, dass du zum New(Pointer) auch ein Dispose(Pointer) am Ende deines Codes mit angefügt hast).

Florian H 19. Okt 2003 18:05

Re: Pointer zuweisen
 
Ah ok, hat sich erledigt...


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:29 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz