FPGMap mit String

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Michl
Beiträge: 2513
Registriert: Di 19. Jun 2012, 12:54

FPGMap mit String

Beitrag von Michl »

Hey,

ich nutze seit Jahren spezialisierte Listen und habe damit bisher keine Probleme gehabt. Nun brauche ich eine Liste mit einem Record mit einem Integer und einem String darin. Als ich diese Liste erstellen wollte, fiel mir ein, da gibt es doch TFPGMap, was IMHO genau das kann, was ich will. Also kurz in meine App eingebaut und nach einer Weile fiel mir auf, daß gleiche Strings nicht per IndexOfData gefunden werden. Nach langem Testen konnte ich das Problem ausfindig machen, es liegt daran, daß mein Programm einen String kürzt und trotz gleichem Inhalt, wird dieser nicht gefunden. Anbei der Code für ein kleines Testprogramm:

Code: Alles auswählen

program project1;

uses
  fgl;

type
  TMyMap = specialize TFPGMap<Integer, String>;

var
  MyMap: TMyMap;
  s: String;

begin
  MyMap := TMyMap.Create;
  s := 'AB';
  MyMap.Add(1, s);
  s := 'A' + 'B';
  WriteLn(MyMap.IndexOfData(s), '[', s, ']');  // das geht

  s := ' AB';
  Delete(s, 1, 1);
  WriteLn(MyMap.IndexOfData(s), '[', s, ']');  // das nicht
  MyMap.Free;
  ReadLn;
end.  
Ist das Verhalten gewollt oder nicht?

Mein System: Windows7, Lazarus 4.99 (rev main_4_99-1688-g82df55c246) FPC 3.2.2 x86_64-win64-win32/win64
Dateianhänge
TFPGMap.zip
(998 Bytes) 139-mal heruntergeladen
Zuletzt geändert von Michl am Di 9. Sep 2025, 18:14, insgesamt 1-mal geändert.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Warf
Beiträge: 2194
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: FPGMap

Beitrag von Warf »

Benutz doch Generics.Collections, die kann von haus aus Strings.
Wenn du bei FGL bleiben willst must du das OnDataPtrCompare Event setzen und dort den String Compare durchführen

Benutzeravatar
Zvoni
Beiträge: 450
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: FPGMap

Beitrag von Zvoni »

Warf hat geschrieben: Di 9. Sep 2025, 13:00 Benutz doch Generics.Collections, die kann von haus aus Strings.
Wenn du bei FGL bleiben willst must du das OnDataPtrCompare Event setzen und dort den String Compare durchführen
Dachte ich auch zuerst, aber es gibt ne "Default"-Vergleichsfunktion (CompareByte).
Weil sonst müsste ja schon sein erster Aufruf fehlschlagen,
Das einzige was mir einfällt ist, ob es vielleicht mit AnsiString vs. Unicode zu tun hat, da per Default Bytes verglichen werden
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Michl
Beiträge: 2513
Registriert: Di 19. Jun 2012, 12:54

Re: FPGMap

Beitrag von Michl »

Warf hat geschrieben: Di 9. Sep 2025, 13:00 Benutz doch Generics.Collections, die kann von haus aus Strings.
Wenn du bei FGL bleiben willst must du das OnDataPtrCompare Event setzen und dort den String Compare durchführen
Das Problem in meinem Programm habe ich schon für mich gelöst. Mit einer Liste, wie schon in einem Haufen anderer Fälle. Das ist kein Problem. Ich fragte mich nur, ob das Verhalten bekannt ist. Unter https://www.freepascal.org/docs-html/rt ... pgmap.html stand nichts. Ein TFPGMapInterfacedObjectData ging auch nicht. Die Suchmaschiene hatte für mich auch nichts ausgespuckt. Daher fragte ich mal hier.

Zvoni hat geschrieben: Di 9. Sep 2025, 15:00 Dachte ich auch zuerst, aber es gibt ne "Default"-Vergleichsfunktion (CompareByte).
Weil sonst müsste ja schon sein erster Aufruf fehlschlagen,
Das einzige was mir einfällt ist, ob es vielleicht mit AnsiString vs. Unicode zu tun hat, da per Default Bytes verglichen werden
Genau. Wenn dann hätte ich erwartet, daß entweder keins oder beides geht. Meine Vermutung wäre, daß es (wenn ich mich recht erinnere, werden bei FPC die Strings referenzgezählt) mit der Referenzzählung und deren Abgleich zu tun hat - ist aber nur ins Blaue geraten.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Mario Peters
Beiträge: 27
Registriert: Sa 26. Apr 2025, 22:41

Re: FPGMap mit String

Beitrag von Mario Peters »

Zufällig stöbere ich hier rum und finde dieses Thread und während mir Egoismus vorgeworfen wird, heißt es auch HIIR, das Problem sei vom User selber gelöst aber ohne die Lösung zu präsentieren. Wennschn dann hat die Moral gefälligst FÜR ALLE User zu gelten. Ich bin Anfänger und kann noch nicht alles automatisch weiisen und in Nullkommanix verstehen.

Hier das Zitsat vom Threadersteller:

"Das Problem in meinem Programm habe ich schon für mich gelöst. Mit einer Liste, wie schon in einem Haufen anderer Fälle. Das ist kein Problem. Ich fragte mich nur, ob das Verhalten bekannt ist. Unter https://www.freepascal.org/docs-html/rt ... pgmap.html stand nichts."

Aber die ERklärung der Lösung feht auch hier, nicht nur bei meinem Ellipsemproblem!

Warf
Beiträge: 2194
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: FPGMap mit String

Beitrag von Warf »

Naja er hat doch geschrieben wie er das problem "gelöst" hat, indem er keine map verwendet hat sondern eine liste.

Damit hat er das unterliegende problem nicht gelöscht sondern einfach alles anders gebaut das er nicht in das problem läuft

Das unterliegende Problem ist schlicht und ergreifend das gleicher string nicht gleich gleicher Inhalt bedeutet wenn raw pointer Vergleich gemacht wird. Generics.Collections macht das besser, FGL ist extrem leichtgewichtig und hat keine so erweiterte Funktionalität. Das problem hier ist auch nicht FGL sondern die Nutzung von dynamischen strings. Da steckt sehr viel Komplexität hinter, was versteckt wird und daher zu nicht offensichtlichen Fehlern wie dem hier führt

Antworten