AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Pointer zuweisen

Offene Frage von "Florian H"
Ein Thema von Florian H · begonnen am 19. Okt 2003 · letzter Beitrag vom 19. Okt 2003
Antwort Antwort
Florian H

Registriert seit: 30. Mär 2003
Ort: Mühlacker
1.043 Beiträge
 
Delphi 6 Professional
 
#1

Pointer zuweisen

  Alt 19. Okt 2003, 13:59
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
Florian Heft
  Mit Zitat antworten Zitat
Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#2

Re: Pointer zuweisen

  Alt 19. Okt 2003, 15:17
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;
Tim Leuschner
  Mit Zitat antworten Zitat
Benutzerbild von Mystic
Mystic

Registriert seit: 18. Okt 2003
Ort: Flerzheim
420 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Pointer zuweisen

  Alt 19. Okt 2003, 15:28
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
Jan Steffens
  Mit Zitat antworten Zitat
ArrayOf..

Registriert seit: 7. Sep 2003
50 Beiträge
 
Delphi 7 Personal
 
#4

Re: Pointer zuweisen

  Alt 19. Okt 2003, 16:23
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).
MfG

  Mit Zitat antworten Zitat
Florian H

Registriert seit: 30. Mär 2003
Ort: Mühlacker
1.043 Beiträge
 
Delphi 6 Professional
 
#5

Re: Pointer zuweisen

  Alt 19. Okt 2003, 16:37
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

@ArrayOf..: ok, habs geändert, war aber bisher auch nur ein test, sonst bemühe ich mich auch immer, variablen "schön" zu benennen...
Florian Heft
  Mit Zitat antworten Zitat
Benutzerbild von Mystic
Mystic

Registriert seit: 18. Okt 2003
Ort: Flerzheim
420 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Pointer zuweisen

  Alt 19. Okt 2003, 16:47
Könntest du vielleicht den kompletten Quelltext veröffentlichen? Vielleicht offenbart sich ja dann das Problem.
Jan Steffens
Der Fachwortgenerator - 100% Schwachsinn --- Der UPnP Router Manager - Kommentare erwünscht!
  Mit Zitat antworten Zitat
ArrayOf..

Registriert seit: 7. Sep 2003
50 Beiträge
 
Delphi 7 Personal
 
#7

Re: Pointer zuweisen

  Alt 19. Okt 2003, 16:58
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).
MfG

  Mit Zitat antworten Zitat
Florian H

Registriert seit: 30. Mär 2003
Ort: Mühlacker
1.043 Beiträge
 
Delphi 6 Professional
 
#8

Re: Pointer zuweisen

  Alt 19. Okt 2003, 17:05
Ah ok, hat sich erledigt...
Florian Heft
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:53 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz