Autor Beitrag
Gagga
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26



BeitragVerfasst: Fr 05.02.21 18:53 
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?
ausblenden 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 user profile iconNarses: Topic aus Dateizugriff verschoben am Fr 05.02.2021 um 22:25
Moderiert von user profile iconTh69: Delphi-Tags hinzugefügt
mandras
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 415
Erhaltene Danke: 102

Win 10
Delphi 6 Prof, Delphi 10.4 Prof
BeitragVerfasst: Fr 05.02.21 21: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
Einloggen, um Attachments anzusehen!

Für diesen Beitrag haben gedankt: Gagga
Gagga Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26



BeitragVerfasst: Sa 06.02.21 14:21 
user profile iconmandras hat folgendes geschrieben Zum zitierten Posting springen:
...
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 166
Erhaltene Danke: 42



BeitragVerfasst: Fr 12.02.21 19: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.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
type
  TMyValue = (mv1, mv2, mv3, mv4, mv5);
  TMyField = Set of TMyValue;
  TMyPlayField = array[0..90..9of 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.
ausblenden 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 := [];
      {andere Zeichen ignorieren}
      if CharInSet(c, ['1' .. '5']) then
      begin
        n := Ord(c) - Ord('1'); // 0..4
        v := TMyValue(n); // mv1..mv5
        Include(f, v);
      end;
      Result[x, y] := f;
    end;
  end;
end;