AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language System.Length: Warum Integer und nicht Cardinal ?

System.Length: Warum Integer und nicht Cardinal ?

Ein Thema von Rollo62 · begonnen am 26. Mai 2021 · letzter Beitrag vom 26. Mai 2021
Antwort Antwort
Seite 1 von 2  1 2   
Rollo62

Registriert seit: 15. Mär 2007
3.882 Beiträge
 
Delphi 12 Athens
 
#1

System.Length: Warum Integer und nicht Cardinal ?

  Alt 26. Mai 2021, 14:21
Delphi-Version: 10.4 Sydney
Hallo zusammen,

ich hätte da mal die oben genannte, blöde Frage an die Sprachexperten.
Macht es aus irgendeinem Grund Sinn das System.Length ein Integer-Resultat zurückgibt für Arrays/Strings,
obwohl es dies logischerweise nie < 0 erreichen kann ?
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: System.Length: Warum Integer und nicht Cardinal ?

  Alt 26. Mai 2021, 14:34
Das dürfte historisch bedingt sein. Bis Delphi 4 gab es gar keine richtigen Unsigned Integer mit 32 Bit. Aber auch schon in 16 Bit Pascal waren es Signed Integers. Somit konnten Funktionen wie Pos/IndexOf usw. -1 als Ergebnis zurück liefern, wenn ein Element/Zeichen nicht in einem Array/String vorhanden war. Auch kann man so leichter Fehler in der Index-Berechnung erkennen.

Sicherlich liegt es aber auch daran, dass das das native Verhalten der x86-Prozessoren ist.

......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.091 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: System.Length: Warum Integer und nicht Cardinal ?

  Alt 26. Mai 2021, 14:41
Wenn du einen Index für eine For-schleife nimmst dann nimmst du hoffentlich logischerweise auch immer einen vorzeichenbehafteten Typ (wie Integer).

Beispiel:
for var i: Cardinal := Low(items) to High(items) verursacht ein Out Of Range wenn items leer ist. Warum? Weil High(..) -1 zurückgibt.
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.882 Beiträge
 
Delphi 12 Athens
 
#4

AW: System.Length: Warum Integer und nicht Cardinal ?

  Alt 26. Mai 2021, 14:48
Dankesehr für die Antworten.

Das dürfte historisch bedingt sein.
Das war auch meine Vermutung.

Somit konnten Funktionen wie Pos/IndexOf usw. -1 als Ergebnis zurück liefern, wenn ein Element/Zeichen nicht in einem Array/String vorhanden war. Auch kann man so leichter Fehler in der Index-Berechnung erkennen.
Für alle Pos/Index ist das richtig, aber Length ?
Ich vermute Du meinst Pos/Length, oder wo hilft das bei Length Fehler zu Erkennen ?

Was daran blöd ist:
Wenn ich bewusst Cardinal benutze, um Fehleingaben (< 0) im Keim zu Ersticken,
und dann Length() mit Cardinal vergleiche:
Delphi-Quellcode:
var
    LMaxLen : Cardinal;

...

    if Length( LArray) <= LMaxLen then
    begin
    ....
dann bekomme ich immer ein Warning, das ich wegcasten muss obwohl es unnötig wäre.

Geändert von Rollo62 (26. Mai 2021 um 14:50 Uhr)
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.882 Beiträge
 
Delphi 12 Athens
 
#5

AW: System.Length: Warum Integer und nicht Cardinal ?

  Alt 26. Mai 2021, 14:50
Wenn du einen Index für eine For-schleife nimmst ...
Dankesehr, mir geht es um den Fall unten beschrieben, mit der blöden Meldung.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.014 Beiträge
 
Delphi 12 Athens
 
#6

AW: System.Length: Warum Integer und nicht Cardinal ?

  Alt 26. Mai 2021, 14:55
Arrays (Strings sind auch Arrays) können eh maximal 2 GB-1 groß werden, auch in 64 Bit-Compilern,
somit ist es vollkommen egal ob Integer oder Cardinal.

Integer ist es, weil es schon immer so war.
Und ja, bei High ist das Integer sogar notwendig, für Arrays die bei 0 beginnen, es -1 sein kann. (gut, man könnte die -1 auch nach Cardinal casten, wie z.B. beim INVALID_HANDLE_VALUE)
Bis vor Kurzem hatten in iOS und Android sogar die Strings mit 0 begonnen. (mitten in 10.4 wurde dieses Verhalten endlich für alle Platformen gleichgezogen, aber die Methoden des StringHelper sind immernoch 0)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (26. Mai 2021 um 15:02 Uhr)
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.377 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: System.Length: Warum Integer und nicht Cardinal ?

  Alt 26. Mai 2021, 14:55
Dankesehr für die Antworten.

Das dürfte historisch bedingt sein.
Das war auch meine Vermutung.
...
Das halte ich für falsch.
Wie Günther schon erwähnte gibt es immer wieder Operationen bei denen negative Werte herauskommen.
Eben das High()-1. Oder wenn man Length(A)-Length(B) macht kann es negative Werte geben. Ebenso bei "if Length(A)<Length(B) then ...". Und nicht zuletzt Dein "if Length( LArray) <= LMaxLen then". Ein Vergleich impliziert eine Subtraktion.
Dann muss Delphi den Typ implizit erweitern auf den nächstgrösseren Typ z.B. auf Int64 und das ist unschön. Und deswegen die Warnung.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.091 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: System.Length: Warum Integer und nicht Cardinal ?

  Alt 26. Mai 2021, 15:01
Ganz genau das wollte ich grade auch schreiben.

Jetzt bleibt mir nur noch der Verweis auf andere Sprachen zum Vergleich (size_t in C++, oder dass size() bzw Length in Java oder C# auch mit Vorzeichen sind).
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.882 Beiträge
 
Delphi 12 Athens
 
#9

AW: System.Length: Warum Integer und nicht Cardinal ?

  Alt 26. Mai 2021, 15:48
Ich verstehe Euch ja, und habe auch Integer an 1000 Stellen dafür genutzt.
Aber insbesondere bei Funktionsaufrufen würde ich mir gerne einen "Guard" ersparen,
deshalb der Cardinal

Delphi-Quellcode:
procedure CopyDing( const AArray : TBytes; const ALen : Integer )
begin
    if ALen < 0 then
        Exit; //<== DAS WÜRDE ICH SICHERHEITSHALBER EINBAUEN MÜSSEN, STATT CARDINAL ==

    Assert( ALen >= 0, 'CopyDing crash'  ); //<== ODER ARBEITET IHR MIT ASSERT ? Hilft aber nur beim Debuggen.

    if Length( AArray) >= ALen then //<== Dann gehts auch mit Integer
    begin
       ....
    end;
end;

Geändert von Rollo62 (26. Mai 2021 um 15:54 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.014 Beiträge
 
Delphi 12 Athens
 
#10

AW: System.Length: Warum Integer und nicht Cardinal ?

  Alt 26. Mai 2021, 16:53
Hilft aber nur beim Debuggen
Kann man aber auch in der Release aktivieren, wenn man möchte.


Du darfst in deiner Funktion den Integer gern nach Cardinal casten und mit Length vergleichen (Length auch nach Integer gecastet, damit der Compiler nichts für den Vergleich unnötig nach Int64 erweitert)

-1 ähhhh $FFFFFFFF ist ja größer als Length und somit raucht die Längenprüfung auch da ab, ohne daß man explizit <0 prüfen muß.
Delphi-Quellcode:
if Cardinal(ALen) <= Cardinal(Length(AArray)) then
  ÜberlaufBzwNichtGenugBytesImArray
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:24 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz