Hallo!
Da hat sich ja einiges getan...
Taj, erst hatte ich die händische Freigabe nicht, wie opfer.der.genauigkeit beschrieben,
Delphi großzügig überlassen.
Dann traten die Probleme auf.
Deshalb habe ich mit der händischen Freigabe eigentlich alles mit SetLength=0 nis nur nil, etc. durchprobiert. nil zuweisen oder nicht ist von der Fehlermeldung her gleich.
Glaube, daß Problem liegt eher an der Verschachtelung des Open Record-Array innerhalb eines andren Records die wiederum in OpenArrays liegen.
Der Speicherzugriffsfehler kommt ja in der
GetMem.inc, Funktion DeleteFree(f: PFree), wobei ich nicht weiß was die GetMem.Inc macht, wofür zuständig, etc. (Glaube aber halt irgendwelche kryptischen Speicherverwaltungsgeschichten).
Habe jetzt die OpenArrays aus den Records in seperate, parallele Arrays gepackt, also ohne Verschachtelung. Das gefällt mir aber nicht, da ich jetzt 3x SetLength(PfeilAnzahl) in meiner übergeordneten Klasse für die ursprünglichen Pfeile und jetzt noch Stützpunkte und Restriktionen aufrufen muß. Sehr leicht fehleranfällig.
Also, wenn jemand noch weitere Speicherfehlermöglichkeiten kennt?!?
Zu:
Zitat: |
Ist zwar schon ein bisschen her, aber ich hatte damals(anno 1890 ) ein Problem mit Assigned und dynamischen Arrays.
Das mit Pointern und @ und vari^ habe ich mich zwar auch schonmal gefragt, aber nie die Muße, das mal genau zu überprüfen.
Wers weiß, kann uns ja mal schlau machen.
|
Informationen (Datentypen) sind nur Speicherinterpretationen an der Speicherstelle, die mit dem @-Operator abgefragt wird. Dem Datentyp Pointer, ein Verweis auf eine Speicherstelle (Adresse), ist die Interpretation egal (ob ein byte, oder ein char). Der Pointer ist eine Variable, der explizit eine Adresse zugewiesen werden kan, wie mit @ abgefragt.
Alle anderen Datentypen sind auch Pointer im Prinzip, die aber schon von der Länge und der Interpretation, damit verbunden die mögliche Operationen, her festgelegt sind.
Delphis Hilfe selbst meint:
Zitat: |
Mit der folgenden Syntax kann ein Zeiger auf jeden beliebigen Typ deklariert werden:
type Zeigertypname = ^Typ
Es ist gängige Programmierpraxis, bei der Definition eines Record-Typs oder eines anderen Datentyps auch einen Zeiger auf diesen Typ zu deklarieren. Dies erleichtert die Verarbeitung von Instanzen des Typs, da das Kopieren größerer Speicherblöcke entfällt.
Es gibt Standardzeigertypen für unterschiedliche Verwendungszwecke. Mit dem Allzwecktyp Pointer kann jeder Datentyp referenziert werden. Eine Dereferenzierung von Variablen des Typs Pointer ist nicht möglich. Den Versuch, einer Pointer-Variablen das Symbol ^ nachzustellen, weist der Compiler zurück. Wenn Sie auf Daten zugreifen wollen, auf die eine Pointer-Variable zeigt, müssen Sie diese Variable in einen anderen Zeigertyp umwandeln, bevor Sie sie dereferenzieren.
|
Naja, früher war das unter DOS ganz witzig den ausgelagerten Videospeicher zu manipulieren, da hat man direkt auf den Speicher zugegriffen (an B$800 oder so) und die Texte, Textfarbe und Hintergrundfarbe verändert, aber Windows nimmt einen sowas ja übel...
Gruß
nike