AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Konstanter dynamischer Array <- Möglich?
Thema durchsuchen
Ansicht
Themen-Optionen

Konstanter dynamischer Array <- Möglich?

Ein Thema von SebE · begonnen am 10. Mär 2009 · letzter Beitrag vom 11. Mär 2009
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.152 Beiträge
 
Delphi 12 Athens
 
#11

Re: Konstanter dynamischer Array <- Möglich?

  Alt 11. Mär 2009, 10:41
nja, kann auch D7 gewesen sein

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:
Habsch do!
Edit2: Oder meinst du im Integer-Array? Da gabs aber keine Probleme. Ich ändere es gleich. Besser ist.
jupp, im Integer Array

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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
SebE

Registriert seit: 31. Jul 2004
Ort: Chemnitz
316 Beiträge
 
Delphi 7 Personal
 
#12

Re: Konstanter dynamischer Array <- Möglich?

  Alt 11. Mär 2009, 12:51
@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?
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#13

Re: Konstanter dynamischer Array <- Möglich?

  Alt 11. Mär 2009, 13:07
Zitat von SebE:
@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"
eigentlich müsster er -1 sein. Denn das bedeutet (zumindest bei Strings), dass das Array nie gelöscht wird. Darf es ja auch nicht, ist ja eine Konstante. Der Wert 1 wäre eigentlich "am richtigsten", aber hier gibt es Probleme aus noch nicht näher geklärten Gründen. Und es schadet ja nicht, den Zähler richtig hoch zu setzen.
Zitat:
Edit: Warum legen dynamische Array keine Größen-/Referenz-Felder an?
Machen Sie ja. Aber eben nur zur Laufzeit.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.152 Beiträge
 
Delphi 12 Athens
 
#14

Re: Konstanter dynamischer Array <- Möglich?

  Alt 11. Mär 2009, 13:08
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:
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
also man kann (zumindestens bei Strings, welche im Grunde auch nur ein dynamisches Array darstellen)
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 von SebE:
Edit: Warum legen dynamische Array keine Größen-/Referenz-Felder an?
bei statischen Array's ist das anders angelegt.
da gibt es keine Referenzzählung und auch die Arraygröße ist nicht in die Datein eingebaut.

dieses sieht praktisch so aus:
Delphi-Quellcode:
Type TStaticArray = packed Record
    Data: packed Array[0..High({var})] of {Typ};
  End;
Length(array) und High(array) werden dabei direkt in das Programm eingebaut.
(die Länge kennt der Compiler ja und baut dann da wo diese Funktionen aufgerufen würden direkt die entsprechende Zahl ein)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
SebE

Registriert seit: 31. Jul 2004
Ort: Chemnitz
316 Beiträge
 
Delphi 7 Personal
 
#15

Re: Konstanter dynamischer Array <- Möglich?

  Alt 11. Mär 2009, 13:15
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)?
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#16

Re: Konstanter dynamischer Array <- Möglich?

  Alt 11. Mär 2009, 13:19
Das ist delphispezifisch. Gerade so eine "tolle" 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....
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.152 Beiträge
 
Delphi 12 Athens
 
#17

Re: Konstanter dynamischer Array <- Möglich?

  Alt 11. Mär 2009, 13:20
[info] hatte oben noch was zum StaticArray nacheditiert.

und rausbekommen hatte ich es, indem ich einfach mal Speicher mir angeguckt hatte

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
Angehängte Dateien
Dateityp: pas fns_types_192.pas (62,7 KB, 4x aufgerufen)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#18

Re: Konstanter dynamischer Array <- Möglich?

  Alt 11. Mär 2009, 13:29
Zitat von himitsu:
PS: bei WideString (OLE32Str) ist der ElementZähler in Byte angegeben, also immer doppelt so groß wie die Zeichenanzahl.
Widestring ist ja auch von Windows implementiert. Da werden intern nur die API-Funktion StrAlloc, StrLen,.... StrDispose aufgerufen.
Und eine neue Variable bekommt auch immer eine Kopie und niemals eine zweite Referenz auf einen Widestring. Dafür gibts ja jetzt UnicodeStrings
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
SebE

Registriert seit: 31. Jul 2004
Ort: Chemnitz
316 Beiträge
 
Delphi 7 Personal
 
#19

Re: Konstanter dynamischer Array <- Möglich?

  Alt 11. Mär 2009, 13:36
Zitat:
bei WideString (OLE32Str) ist der ElementZähler in Byte angegeben, also immer doppelt so groß wie die Zeichenanzahl.
Wie soll ich das verstehen?
Ein Element (ein Zeichen) ist doch immer ein Byte(?)
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.152 Beiträge
 
Delphi 12 Athens
 
#20

Re: Konstanter dynamischer Array <- Möglich?

  Alt 11. Mär 2009, 14:03
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 01:44 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