TStringList.IndexOf ein 32Bit Integer ?

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.
Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

TStringList.IndexOf ein 32Bit Integer ?

Beitrag von Mathias »

Müsste auf einem 64Bit OS IndexOf nicht ein 64Bit Integer sein ?
Theoretisch wären Listen mit mehr als 4Mrd Zeichen möglich.
SizeUInt wäre der OS angepasste Wert.
Aus

Code: Alles auswählen

    function IndexOf(const S: string): Integer; override;
würde dann

Code: Alles auswählen

    function IndexOf(const S: string): SizeUInt; override;
Ist dies ein Bug, oder einfach eine Altlast die nie angepasst wurde ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: TStringList.IndexOf ein 32Bit Integer ?

Beitrag von theo »

Mathias hat geschrieben:
Sa 25. Feb 2023, 15:41
Theoretisch wären Listen mit mehr als 4Mrd Zeichen möglich.
Der Index adressiert einen String, nicht ein Zeichen.
Also theoretisch 2'147'483'648 Strings. Reicht das nicht?

PascalDragon
Beiträge: 825
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: TStringList.IndexOf ein 32Bit Integer ?

Beitrag von PascalDragon »

Mathias hat geschrieben:
Sa 25. Feb 2023, 15:41
Müsste auf einem 64Bit OS IndexOf nicht ein 64Bit Integer sein ?
Alle Container Typen nutzen auch unter 64-bit die die 32-bit Typen für Indices, da hierdurch der Umzug von 32- auf 64-bit bei gleichzeitiger Portierung von Delphi zu Lazarus ohne große Codeänderungen möglich ist (da man dann keine Funktionssignaturen zum Beispiel von virtuellen Funktionen oder von Funktions-/Methodenzeigern anpassen muss).
Mathias hat geschrieben:
Sa 25. Feb 2023, 15:41
SizeUInt wäre der OS angepasste Wert.
Nein, es wäre SizeInt, da Pascal eine auf vorzeichenbehafteten Typen basierende Sprache ist. Typen wie Strings und Arrays haben für ihre Längen auch SizeInt und nicht SizeUInt.
FPC Compiler Entwickler

siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: TStringList.IndexOf ein 32Bit Integer ?

Beitrag von siro »

Ich habe gedacht, der Typ Integer passt sich dem Betriebssystem automatsich an
Mindestens jedoch 16 Bit so habe ich das mal erlernt....

Bei 16 Bit und 32 Bit Sytemem geht das ja auch,
aber bei 64 Bit Systemen anscheinend nicht mehr, hab ich grad festgestellt
SizeOf(Integer) ist 4 auf einem 64 Bit System, :shock:
das war mir jetzt auch neu.
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

MmVisual
Beiträge: 1445
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: TStringList.IndexOf ein 32Bit Integer ?

Beitrag von MmVisual »

Abgesehen davon braucht man in diesem Fall den Typ "Integer", denn wenn der String nicht gefunden wird gibt die Funktion -1 zurück.
Wenn der Typ auf Unsigned geändert wird, was soll da dann zurück gegeben werden? Jedenfalls wäre jede positive Zahl falsch.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: TStringList.IndexOf ein 32Bit Integer ?

Beitrag von Mathias »

Alle Container Typen nutzen auch unter 64-bit die die 32-bit Typen für Indices, da hierdurch der Umzug von 32- auf 64-bit bei gleichzeitiger Portierung von Delphi zu Lazarus ohne große Codeänderungen möglich ist (da man dann keine Funktionssignaturen zum Beispiel von virtuellen Funktionen oder von Funktions-/Methodenzeigern anpassen muss).
Das ist eine Erklärung.
Nein, es wäre SizeInt,
Stimmt, wen er nicht findet, wird -1 ausgespuckt.
Ich habe gedacht, der Typ Integer passt sich dem Betriebssystem automatsich an
Das ist so, warum auch immer.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: TStringList.IndexOf ein 32Bit Integer ?

Beitrag von siro »

ich nehme mal meinen ursprünglichen Post hier weg um keine unnötigen Diskussionen aufkommen zu lassen....
Mich wundert es nur wer den merkwürdigen Typen Integer erfunden hat.... :mrgreen:

auf einem 8 Bit System ist eine Integer 16 Bit
auf einem 16 Bit System ist ein Integer 16 Bit
auf einem 32 Bit System ist ein Integer 32 Bit
auf einem 64 Bit System ist er auch 32 Bit :?

Den Zusammenhang muss man erstmal verstehen..... :roll:
Zuletzt geändert von siro am So 26. Feb 2023, 09:19, insgesamt 3-mal geändert.
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 331
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon (Windows wenn notwendig), Lazarus 3.0 FPC 3.3.1

Re: TStringList.IndexOf ein 32Bit Integer ?

Beitrag von Niesi »

Ehrlich gesagt: verstehe ich nicht.

Integer ist 'ne ganze Zahl ...
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: TStringList.IndexOf ein 32Bit Integer ?

Beitrag von Mathias »

siro hat geschrieben:
So 26. Feb 2023, 00:01
ich nehme mal meinen ursprünglichen Post hier weg um keine unnötigen Diskussionen aufkommen zu lassen....
Mich wundert es nur wer den merkwürdigen Typen Integer erfunden hat.... :mrgreen:

auf einem 8 Bit System ist eine Integer 16 Bit
auf einem 16 Bit System ist ein Integer 16 Bit
auf einem 32 Bit System ist ein Integer 32 Bit
auf einem 64 Bit System ist er auch 32 Bit :?

Den Zusammenhang muss man erstmal verstehen..... :roll:
Schade hast du dein vorheriger Post gelöscht, aber du hast vollkommen recht. Einzig, du muss es nicht neu erfinden.
FPC stellt int8, uint8, int16, uint16, etc. zur Verfügung.
Oder eben diese, welche an die Plattform angepasst sind:

Code: Alles auswählen

  SizeInt = Int64;
  SizeUInt = QWord;
  PtrInt = Int64;
  PtrUInt = QWord;  
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: TStringList.IndexOf ein 32Bit Integer ?

Beitrag von theo »

Warum nicht einfach mal die Doku lesen?
As of version 3.2.0, the data type integer is simply an alias depending on the currently selected compiler compatibility mode. It does not depend on the CPU type, therefore it is quite possible that the CPU could in fact deal with integers having an even larger magnitude than integer provides.
https://wiki.freepascal.org/Integer#Fre ... deviations

Das hat also nur mit dem Compilermodus zu tun und nicht mit der CPU

Das kann man nun gut finden oder nicht, aber mindestens zur Kenntnis nehmen sollte man das, bevor man darüber spricht.

fpcint.png
fpcint.png (26.33 KiB) 967 mal betrachtet
The integer type is an alias to the smallint type in the default Free Pascal mode. It is an alias for the longint type in either Delphi or ObjFPC mode.
https://www.freepascal.org/docs-html/re ... 26-26003r2

Also wie immer: RTFM! :wink:

siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: TStringList.IndexOf ein 32Bit Integer ?

Beitrag von siro »

Ja Theo, Du hast recht, das kann man alles nachlesen...
Dass man es über den Mode sogar umschalten kann, wueste ich noch nicht. :shock:
okay, IDNRTFM (i did not read the fucking manual) :P

Man kann sicher geteilter Meinung sein mit dem Integer
Wenn ich 2 Systeme z.B. über eine Schnittstelle verbinde und jedes hat eine andere Meinung über die Größe des Integers,
dann stellt das ein echtes Problem dar. Deshalb benutze ich generell "festgelegte" Datentypen, die eindeutig definiert sind
und die gibt es ja in Pascal und auch anderen Sprachen. Wobei wirklich festgelegt ist ein Word z.B. auch nicht.

Ich hab mal einen Ausschnitt aus meiner Software Doku angehangen:
Software_Datentype_C_Pascal.pdf
(120.51 KiB) 40-mal heruntergeladen
@Mathias
int8, uint8, int16, uint16
Genau, das meinte ich mit "festgelegten" Datentypen. Da gibts keine Ungereimtheiten.
...ich hätte es tatsächlich nicht neu erfinden müssen...

Danke für euro Infos
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: TStringList.IndexOf ein 32Bit Integer ?

Beitrag von theo »

siro hat geschrieben:
So 26. Feb 2023, 11:26
IDNRTFM
:lol: Das kommt in den besten Familien vor! :wink:

Aber auch zur ursprünglichen Frage nach der StringList.
Ich sehe da die praktische Relevanz nicht so wirklich.
Selbst ohne Overhead und sonstigen Begrenzungen und wenn man vom kürzest möglichen String ausgeht (2 Char, weil bei 1 Char könnte man einen String nehmen), kommt man mit der Longint Stringlist bereits auf 4GB RAM,, wenn ich richtig rechne., und das nur für eine Stringlist!
Da würde mein Küchenlaptop schon streiken. :wink:

Bei "normalen" Strings von durchschnittlich 80 Zeichen bräuchte man schon 160GB RAM.

Ich denke also in praktischer Hinsicht reicht LongInt für TStringList noch lange.

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: TStringList.IndexOf ein 32Bit Integer ?

Beitrag von Socke »

theo hat geschrieben:
So 26. Feb 2023, 11:39
Aber auch zur ursprünglichen Frage nach der StringList.
Ich sehe da die praktische Relevanz nicht so wirklich.
Selbst ohne Overhead und sonstigen Begrenzungen und wenn man vom kürzest möglichen String ausgeht (2 Char, weil bei 1 Char könnte man einen String nehmen), kommt man mit der Longint Stringlist bereits auf 4GB RAM,, wenn ich richtig rechne., und das nur für eine Stringlist!
Da würde mein Küchenlaptop schon streiken. :wink:

Bei "normalen" Strings von durchschnittlich 80 Zeichen bräuchte man schon 160GB RAM.

Ich denke also in praktischer Hinsicht reicht LongInt für TStringList noch lange.
Bei den Datenmengen brauchst du sowieso effizientere Zugriffsmethoden. Zwar hilft hier ein Binary Search ein wenig, in solchen Anwendungen hast du aber dann meist auch andere Zugriffsmethoden (Indizes, Hash-Listen etc.).
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: TStringList.IndexOf ein 32Bit Integer ?

Beitrag von Mathias »

Ich sehe da die praktische Relevanz nicht so wirklich.
Früher hatte man gelacht. wen man die 4GB-Grenze überschreitete.
Wer weis, in 10-20 Jahren habe wir Rechner welche über 4Tera-Byte Ram haben.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: TStringList.IndexOf ein 32Bit Integer ?

Beitrag von theo »

Mathias hat geschrieben:
So 26. Feb 2023, 17:02
Ich sehe da die praktische Relevanz nicht so wirklich.
Früher hatte man gelacht. wen man die 4GB-Grenze überschreitete.
Wer weis, in 10-20 Jahren habe wir Rechner welche über 4Tera-Byte Ram haben.
Wir sprechen von eine Stringlist. Was willst du denn in 10-20 Jahren in der Stringlist speichern?
Die ganze Weltliteratur 500 Mal kopiert in der gleichen Liste?
Das braucht so doch kein Mensch. Dann bieten sich andere Strukturen an, z.B. Datenbanken.
Ausserdem werde ich meinen Küchenlaptop und den Raspi auch in 10 Jahren noch haben.. :wink:
Und auch ausserdem: Sollte das irgendwann sinnvoll werden, dann erweitert man es halt, wo ist das Problem?

Antworten