| Autor |
Beitrag |
gispos
      
Beiträge: 94
WIN 7
XE10, D2007
|
Verfasst: Fr 13.02.09 16:37
Servus,
habe da ein Problem.
Mir stehen max.32 Byte zu Gruppen-Bildungen zur Verfügung, bisher verwende ich ein AnsiChar für jede Gruppe. ABCDE… usw.
Habe z.B. 20000 Records, jeder Record kann max. 32 Byte zusätzlich aufnehmen die ich in einem Array [0..31] of AnsiChar speichere. Und nun möchte ich Abfragen ist dieser Record einer Gruppe oder auch mehreren Gruppen zugeordnet.
Ist ja nicht schwierig durch AnsiIndexText oder Ähnliches abzufragen ob "C" in diesem Array vom Record enthalten ist, der Record also der Gruppe "C" zugeordnet ist.
Das Problem ist, dass durch diese Methode eben nur 32 Gruppen angelegt werden können und jede weitere Gruppe 1 Byte (Char) an neuem Speicher belegen würde.
Gibt es eine Möglichkeit aus 32 Byte mehr als 32 Möglichkeiten (Gruppen) herauszuholen?
Bedienung ist allerdings das eine Abfrage nach einer Gruppe ohne rechen intensive Operationen geschehen sollte.
Schon mal Dank & Grüße
gispos
|
|
Sinspin
      
Beiträge: 1340
Erhaltene Danke: 120
Win 10
RIO, CE, Lazarus
|
Verfasst: Fr 13.02.09 16:57
Mit 32 Byte bekommst du ein Set of Byte hin. Was dann heißt das du 256 verschiedene Gruppen unterscheiden kannst. Pro Byte werden auf diese Art 8 Gruppen (für jedes Bit eine) untergebracht.
Bei einem Set wird dabei die interne Verwaltung von Delphi übernommen. Du hast also damit keine Probleme zu prüfen ob ein Record zur Gruppe gehört oder nicht.
_________________ Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 13.02.09 17:05
|
|
gispos 
      
Beiträge: 94
WIN 7
XE10, D2007
|
Verfasst: Fr 13.02.09 17:56
Mal danke für die Antworten… die muss ich mir erst noch setzen lassen,
auf die schnelle komm ich damit nicht klar.
Was ich vielleicht nicht richtig dargestellt habe ist, das ein Record in allen Gruppen enthalten sein kann und ich die Daten speichern und später wieder auslesen muss.
Und ich wüsste jetzt nicht wie ich mit 32 Byte alle Verweise zu den Gruppen speichern könnte.
jaenicke wäre es Möglich mir ein kleines Beispiel aufzuzeigen? Damit ich in etwa verstehe was Du meinst.
Gruß gispos
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 13.02.09 18:48
Kleines Beispiel, ich denke mal, das ist verständlich, deshalb habe ich es erstmal nicht kommentiert: Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| private DataArray: array[0..31] of Byte;
...
procedure TForm145.SetBit(Bit: Byte; Value: Boolean); var tmp: PByte; begin tmp := @DataArray[Bit div 8]; if Value then tmp^ := tmp^ or (1 shl (Bit mod 8)) else tmp^ := tmp^ xor (1 shl (Bit mod 8)); end;
function TForm145.GetBit(Bit: Byte): Boolean; begin Result := DataArray[Bit div 8] and (1 shl (Bit mod 8)) > 0; end; | Ein komplettes Beispiel liegt im Anhang.
Jedenfalls sollte das so deutlich schneller sein als mit irgendwelchen Stringoperationen.
// EDIT:
Man könnte das natürlich auch ganz ohne Array machen, nur mit Speicherbereichen. So ähnlich habe ich das beim Adventsgewinnspiel gemacht:
www.delphi-forum.de/....php?p=540248#540248
Man könnte natürlich statt dem CleanArray auch wie dort mit FillMemory arbeiten, aber so hielt ich es erstmal für einfacher. Das ginge so: Delphi-Quelltext 1: 2: 3: 4:
| CopyMemory(@DataArray, @CleanArray, Length(DataArray)); FillMemory(@DataArray, Length(DataArray), 0); |
Einloggen, um Attachments anzusehen!
|
|
Sinspin
      
Beiträge: 1340
Erhaltene Danke: 120
Win 10
RIO, CE, Lazarus
|
Verfasst: Fr 13.02.09 19:58
_________________ Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
|
|
gispos 
      
Beiträge: 94
WIN 7
XE10, D2007
|
Verfasst: Fr 13.02.09 20:03
Sinspin danke für deinen Hinweis auf ein Set of Byte.
Erste Versuche mit speichern und wieder lesen aus einem Stream waren Erfolgreich!
Mit "include, exclude und In" lässt sich das auch gut handeln.
256 Gruppen anstatt 32 ist doch schon was.
jaenicke ja super, wollte gerade noch mal nachhaken...
Werde mich damit wohl einige Stunden beschäftigen und will Dir erst mal für deine Hilfe u. Bemühungen Danken. Werde mich später (Morgen) noch mal Melden und über Erfolge oder Misserfolge berichten.
Also erst mal danke an euch beide.
Gruß gispos
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 13.02.09 20:11
Sinspin hat folgendes geschrieben : | | Vieleicht übersehe ich gerade etwas, aber wenn man DataArray einfach als Set of Byte deklariert, geht genau die gleiche Anzahl von Gruppen und man braucht keine weiteren Funktionen. Das übernimmt dann alles Delphi für einen. |
Das ist richtig. Es eignet sich bei diesen Setgrenzen schon. Wenn man aber bspw. 753 Gruppen hat oder so, dann geht das nicht mehr so gut. Mit einem bitweisen Vorgehen kann man (fast) exakt so viele Bit belegen wie man auch tatsächlich braucht. Bei Datenspeicherungen spart man so also Platz.
Beide Vorgehensweisen haben Vor- und Nachteile, das kommt auf den Anwendungsfall an. Einfacher ist sicher set of. 
|
|
gispos 
      
Beiträge: 94
WIN 7
XE10, D2007
|
Verfasst: Fr 13.02.09 20:29
Habe doch keine Stunden gebraucht.
Mehr als 256 Gruppen sind mit 32 Byte wohl nicht drin.
Da ich die 32 Byte nicht dynamisch belege ist mir das mit dem Set of im Moment lieber.
Das mit dem Array wird mir aber sicherlich auch mal hilfreich sein.
Also noch mal dank und Grüße
gispos
|
|
Sinspin
      
Beiträge: 1340
Erhaltene Danke: 120
Win 10
RIO, CE, Lazarus
|
Verfasst: Fr 13.02.09 21:18
_________________ Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
|
|
|