AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi EInvalidPointer bei verschachtelten dynamischen Arrays
Thema durchsuchen
Ansicht
Themen-Optionen

EInvalidPointer bei verschachtelten dynamischen Arrays

Ein Thema von alkan · begonnen am 14. Sep 2008 · letzter Beitrag vom 15. Sep 2008
 
Roachford
(Gast)

n/a Beiträge
 
#2

Re: EInvalidPointer bei verschachtelten dynamischen Arrays

  Alt 14. Sep 2008, 22:00
Grundsätzlich gehen auch dynamische Arrays zur Objektverwaltung, aber grundsätzlich kann man trotzdem nur nochmal mit Nachdruck auf die Delphi-Referenz durchsuchenTObjectList verweisen.

Zitat von alkan:
Denn woher soll der Compiler wissen, wie viel RAM er für das Array Batch reservieren soll, wenn noch nicht festeht, welche Länge die einzelnen Unterelemente vom Typ TTicket ihrerseits haben werden?
Das steht schon fest: 4 Bytes. Jede Instanz wird über ihre Adresse verwaltet, somit hat jeder Array Eintrag bei dir 4 Bytes, also ein Pointer. Mit dem Constructor-Aufruf wird der benötigte Speicherplatz für die Objekt-Instanz reserviert (und initialisiert) und die Adresse des Blockes wird vom Konstruktor zurück gegeben (die Instanz).

Zitat von alkan:
Kennt jemand einen Workaround für dieses Problem?
Ja, unbedingt sauber arbeiten und sich nicht selber die Daten überschreiben:

Delphi-Quellcode:
  procedure TTicketBatch.AddTicket(InTicket: TTicket);
  begin
    inc(TicketCount);
    SetLength(Ticket, TicketCount);
    Ticket[TicketCount-1] := TTicket.Create;
    Ticket[TicketCount-1] := InTicket;
  end;
Du weist dem Eintrag TicketCount-1 eine neue Instanz zu. Danach überschreibst du die Instanz mit der übergebenen Instanz. Damit ist die erste erzeugte Instanz verloren, da alle Referenzen auf diese gelöscht wurden. Und genauso musst du beachten, dass die übergebene Instanz nach der AddTicket() Funktion von der Liste referenziert wird und somit darf der Aufrufer die übergebene Instanz nicht freigeben. Wenn er dies tut, wirst du das später beim Versuch die Instanzen in dem Array freizugeben, bereuen.

Und warum eine Variable TicketCount, wo du doch jederzeit die Länge des Arrays mit Delphi-Referenz durchsuchenLength() ermitteln kannst?
  Mit Zitat antworten Zitat
 


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 18:19 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-2025 by Thomas Breitkreuz