![]() |
Pointer zuweisen
Hi,
wie kann ich einem Pointer einen anderen Pointer zuweisen? ich habe sowas:
Delphi-Quellcode:
Aber da bekomme ich dann immer einen Fehler...
var
pointer : ^ttest; list : TList; begin new(pointer); list :=TList.Create; // ...[Einträge hinzufügen]... pointer := list.Items[0]; // !! EXCEPTION !! // ...[Freigeben etc]... end; 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 |
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; |
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 |
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). |
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... |
Re: Pointer zuweisen
Könntest du vielleicht den kompletten Quelltext veröffentlichen? Vielleicht offenbart sich ja dann das Problem.
|
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). |
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