![]() |
Re: Konstanter dynamischer Array <- Möglich?
nja, kann auch D7 gewesen sein :gruebel:
aber da hatte ich zumindestens in Assembler die per "DB daten" eingebaut und dann das gesammte Array (nicht nur die Unterarrays) daruf umgeleitet. praktisch nachträglich einer leeren Array-Variable diese konstanten Daten zugewiesen [add] Zitat:
Nicht daß mal der MemoryManager unter unglücklichen Umständen ausversehn versucht die konstanten Daten, welche nicht hier ja in seinem Bereich liegen freizugeben. Oder ausversehn in einem anderem Var-Array, welchem man vorher dieses Array übergeben hat, beim Ändern von Werten diese versucht werden in der Konstante zu ändern, statt vorher eine Kopie anzulegen. Die Referenzzählung machte bei mir schonmal Probleme, als ich (nur bei normalen Array's und nicht expliziet bei soeinem Const-Array) versuchte den Wert zu ändern.
Delphi-Quellcode:
// nur daß hierbei auch Array1[x] geändert wurde
Array2 := Array1; Array2[x] := irgendwas; // hier ging es aber o.O Array2 := Copy(Array1); Array2[x] := irgendwas; |
Re: Konstanter dynamischer Array <- Möglich?
@sirius :
Dein Beispiel ist sehr interessant. Wenn ich das richtig verstanden habe: Der Referenzzähler ist 2 -> einer für die Konstante selbst und der zweuite für die "Record-Zuweisung" Meine Idee war Nullterminierte Arrays anzulegen. Schön, dass sich dieser Thread selbstständig gemacht hat und man wieder etwas lernen konnte. Edit: Warum legen dynamische Array keine Größen-/Referenz-Felder an? |
Re: Konstanter dynamischer Array <- Möglich?
Zitat:
Zitat:
|
Re: Konstanter dynamischer Array <- Möglich?
Eigentlich ist die Referenz -1 (steht normaler Weise für "liegt nicht im RAM") .. bzw 1, wenn nur eine Refferenz vorhanden ist ... hier aber sicherheitshalber 2, damit es nicht unter blöden Umständen vorkommt, daß mal versucht wird den "nicht vorhandenen" Speicher freizugeben oder darin rumzuschreiben.
Delphi-Quellcode:
also man kann (zumindestens bei Strings, welche im Grunde auch nur ein dynamisches Array darstellen)
Type TDynArray = packed Record
RefCount: LongInt; ElementCount: LongInt; Data: packed Array[0..High({var})] of {Typ}; End; Var var: TMyDynArray; var = @TDynArray.Data; // die Variable zeigt auf den Anfang von Data // Pointer(var) = nil > nil {in EXE} > nil {in RAM} // // RefCount = 0 = -1 > 0 // ElementCount = 0 = Length(var) = Length(var) // @Data - = var = var aus dem Pointer rausbekommen, ob es Inhalt gibt oder der String '' ist und aus RefCount bekommt man mit wo der String liegt (-1 = Konstante, 0 gibt's nicht und größer 0 gibt es die Anzahl der Referenzen an) PS: Beim alten Delphi-MemoryManager lag vor RefCount noch dein weiter Integer vom SpeicherManager (welcher Status des Speicherblocks angab) [add] Zitat:
da gibt es keine Referenzzählung und auch die Arraygröße ist nicht in die Datein eingebaut. dieses sieht praktisch so aus:
Delphi-Quellcode:
Length(array) und High(array) werden dabei direkt in das Programm eingebaut.
Type TStaticArray = packed Record
Data: packed Array[0..High({var})] of {Typ}; End; (die Länge kennt der Compiler ja und baut dann da wo diese Funktionen aufgerufen würden direkt die entsprechende Zahl ein) |
Re: Konstanter dynamischer Array <- Möglich?
Super, danke euch.
Ist es eine "reine" Delphi-Angewohnheit oder machen es andere (imperative) Sprachen (wie C) auch so? Wo habt ihr eurer genaues Wissen her (Delphi-Tutorials, oder zählt das unter "allgemein", so dass man das im Theorieteil eines Informatik-Buches nachlesen kann)? |
Re: Konstanter dynamischer Array <- Möglich?
Das ist delphispezifisch. Gerade so eine "tolle" :zwinker: Sprache wie C hat diese tolle Verwaltung von Strings nicht. Ähnlich sieht es mit dynamischen Arrays aus.
Hier hat der Delphi-Compiler im Hintergrund auch ganz schön zu tun. Wo man das Wissen herbekommt? Mitlesen in dem Forum und Rumprobieren und Angucken des CPU-Fensters.... |
Re: Konstanter dynamischer Array <- Möglich?
Liste der Anhänge anzeigen (Anzahl: 1)
[info] hatte oben noch was zum StaticArray nacheditiert.
und rausbekommen hatte ich es, indem ich einfach mal Speicher mir angeguckt hatte :roll: PS: bei WideString (OLE32Str) ist der ElementZähler in Byte angegeben, also immer doppelt so groß wie die Zeichenanzahl. und es gibt keine Referenzzählung (bzw. die ist immer 1) [add] schau dir einfach mal im Anhang die Funktionen DynArrayInfo/DynArrayInfoC bzw. StringInfo/StringInfoC an |
Re: Konstanter dynamischer Array <- Möglich?
Zitat:
Und eine neue Variable bekommt auch immer eine Kopie und niemals eine zweite Referenz auf einen Widestring. Dafür gibts ja jetzt UnicodeStrings :D |
Re: Konstanter dynamischer Array <- Möglich?
Zitat:
Ein Element (ein Zeichen) ist doch immer ein Byte(?) |
Re: Konstanter dynamischer Array <- Möglich?
WideString = WideChar = 2 Byte pro Zeichen
UnicodeString (gibt es seit D2009) = WideChar = auch 2 Byte pro Zeichen, aber hier gibt ElementCount die anzahl der Elemente/Zeichen an, so wie eigentlich bei allen Delphi-Array's auch. (OK Ansi = 1 Byte pro Zeichen, also da stimmt es überein) Der Grund: WideString ist nur eine delphiinterne Umleitung zum OLEString und der zählt halt anders. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:39 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