Forum: Object-Pascal / Delphi-Language
Delphi
by 3_of_8,
16. Mär 2008
Was heißt da gähn? Nach deiner Begründung dürfte array ja auch nicht gehen und der Compiler müsste da dann auch eine Obergrenze setzen.
Forum: Object-Pascal / Delphi-Language
Delphi
by 3_of_8,
16. Mär 2008
Wenn array of <Typ> geht, warum nicht set of Cardinal? Letzteres ist sogar kleiner.
Forum: Object-Pascal / Delphi-Language
Delphi
by 3_of_8,
16. Mär 2008
Was dann aber zu unnötigem Speicherverbrauch führen kann. Eine Hashset-Implementation oder eine sortierte Liste von Sets oder sogar eine sortierte Liste von getaggten, sortierten Listen von Integern könnte hier sinnvoller sein. Dann kann man immerhin in logarithmischer Zeit nach Koordinaten suchen.
Forum: Object-Pascal / Delphi-Language
Delphi
by 3_of_8,
16. Mär 2008
Nein, tue ich nicht. TObject ist kein Ordinaltyp, Int64 auch nicht (zumindest nicht in 32 Bit-Delphi). Spätestens bei Cardinal sollte Schluss sein, das sind ja bereits 128 MB pro Set. Aber zumindest Words sollten drin sein.
Aber der Compiler kann definitiv die Obergrenze sehen, in dem Fall ist es zum Beispiel high(Cardinal).
Forum: Object-Pascal / Delphi-Language
Delphi
by 3_of_8,
16. Mär 2008
Cum hoc ergo propter hoc?
Oder anders gesagt: Du schließt falsch. Du solltest den Artikel schon weiterlesen. Im ersten Satz steht:
Forum: Object-Pascal / Delphi-Language
Delphi
by 3_of_8,
16. Mär 2008
Weil du "Fließkommazahlen" geschrieben hast, was falsch ist. ;)
Und der Compiler kann die Obergrenze ja leicht ermitteln, indem er sich das größte Element ansieht.
Forum: Object-Pascal / Delphi-Language
Delphi
by 3_of_8,
16. Mär 2008
Beliebig lange Gleit(!)kommazahlen geben die gängigen Prozessoren nicht her, beliebig lange (bzw. fast beliebig lange) Sets schon. Die Bytegrenze ist vermutlich ein Relikt aus alten Zeiten.
Forum: Object-Pascal / Delphi-Language
Delphi
by 3_of_8,
16. Mär 2008
Klar kann man das so machen. Bei Words hat man dann aber sogar bei Bitvektoren einen Speicherverbrauch von 128 MB.
Forum: Object-Pascal / Delphi-Language
Delphi
by 3_of_8,
16. Mär 2008
Hat er doch oben geschrieben: Er will eine Menge, in der er (kartesische) Koordinaten speichern kann. In einem normalen Set kannst du nur ordinale Typen speichern, und Koordinaten der Form (x|y) sind nunmal nicht ordinal, weder in Delphi noch in der Mathematik. ;)
Forum: Object-Pascal / Delphi-Language
Delphi
by 3_of_8,
16. Mär 2008
Ein Bitvektor ist im Prinzip das, was die Pascal/Delphi-Sets machen oder auch die Klasse TBits: Man benutzt einfach einzelne Bits, um einen Boolean-Wert zu speichern.
In einem 32-Bit-Cardinal hat man z.B. 32 Bits, kann also 32 Booleans darin kodieren. Realisiert wird das über die binären Operatoren von Delphi.
Zum Abfragen eines Bits verwendet man sowas:
function GetBit(const Vector,...
Forum: Object-Pascal / Delphi-Language
Delphi
by 3_of_8,
16. Mär 2008
Nur so nebenbei: Bei einem Bitvektor wäre der Speicherverbrauch um den Faktor 32 geringer.
Forum: Object-Pascal / Delphi-Language
Delphi
by 3_of_8,
16. Mär 2008
So geht das nicht. Ich würde hier ein Hashset verwenden, dann brauchst du nur eine zweidimensionale Hashfunktion. Alternativ geht auch eine Bitvektor mit einer Zuordnungsfunktion, die deine zwei Koordinaten umrechnet. D.h. du verwendest sowas wie TBits und wenn du sehen willst, ob (X|Y) enthalten ist, fragst du den Wert Y*Width+X ab.