Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Teilstrings in set of byte
Gagga - Fr 05.02.21 19:53
Titel: Teilstrings in set of byte
Hallo!
Ich habe eine variable Menge an Strings[10], die jeweils 10 Teilstrings[1] haben, die für wechselnde Zahlen von 1 bis 5 stehen. Das ist nicht glücklich, kann ich aber nicht ändern.
Wie bekomme ich die Zahlen in ein dynamisches Array von
set of byte?
Delphi-Quelltext
1:
| for a := 1 to 10 do include(Menge[x], strtoint(String[x][a])) |
ist sehr langsam.
Kann jemand mit Tempo helfen?
Gruß
Gagga
Moderiert von Narses: Topic aus Dateizugriff verschoben am Fr 05.02.2021 um 22:25
Moderiert von Th69: Delphi-Tags hinzugefügt
mandras - Fr 05.02.21 22:35
Guten Abend,
ich habe da auf die Schnelle einmal eine kleine Konsolanwendung gebastelt die 3 Methoden für die Umwandlung String->Set implementiert, einmal Deine, dann eine einefache PAS-Variante ohne StrToInt und dann noch eine (eher hingekleckste) Assemblerprozedur.
Die Umwandlung wird jeweils 10 Mio mal durchgeführt und dann die Zeiten ausgegeben.
Es ist Quick-and-Dirty und geht zwingend davon aus, daß die Strings wirklich nur Zahlen enthalten und im Zwei-Byte-Code (Unicode) vorliegen
Gagga - Sa 06.02.21 15:21
mandras hat folgendes geschrieben : |
...
eine (eher hingekleckste) Assemblerprozedur....
|
Danke Dir Mandras!
Dein Klecks ist - bei mir eingebaut - achtmal schneller als meine Variante. Die Anforderung an die Routine habe ich allerdings verkürzt, so dass ich den Klecks ohne Assemblerkenntnisse nicht anpassen kann. Denn jedes Zeichen wird in zweierlei Form in ein zweidimensionales Array eingesetzt: Array[PositionImString,Strtoint(Teilstring)]. Ich hoffe, es ist verständlich.
Schönes Wochenende
Gagga
Blup - Fr 12.02.21 20:35
Ich hoffe ich habe deiner Beschreibung richtig interpretiert.
Es geht um eine Art "Spielfeld" (ähnlich Sodoku) von 10x10 Feldern.
Jedes Feld enthält nach dem Laden genau einen Wert aus 1 .. 5.
Für die Darstellung der Daten aus den Strings wird eigentlich kein Set benötigt.
Nur wenn jedes Feld eine Auswahl aus mehreren Werte aufnehmen soll, benötigt man ein Set.
Delphi-Quelltext
1: 2: 3: 4:
| type TMyValue = (mv1, mv2, mv3, mv4, mv5); TMyField = Set of TMyValue; TMyPlayField = array[0..9, 0..9] of TMyField; |
Der Inhalt dieses Spielfeldes soll aus einer Liste von 10 Strings gelesen werden.
Jeder dieser 10 Strings besteht aus genau 10 Zeichen.
Die Zeichen '1' .. '5' ensprechen den Feldwerten mv1 .. mv5.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| function StringsToMyPlayField(ASource: TStringList): TMyPlayField; var n, x, y: Integer; s: string; c: Char; v: TMyValue; f: TMyField; begin for y := 0 to 9 do begin s := ASource[y]; for x := 0 to 9 do begin c := s[x + 1]; f := []; if CharInSet(c, ['1' .. '5']) then begin n := Ord(c) - Ord('1'); v := TMyValue(n); Include(f, v); end; Result[x, y] := f; end; end; end; |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!