Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Cardinal anstatt Integer? (https://www.delphipraxis.net/39671-cardinal-anstatt-integer.html)

Shaman 6. Feb 2005 10:32


Cardinal anstatt Integer?
 
Hallo zusammen

Ich würde gerne wissen, wie ihr das so handhabt mit den Cardinals. Sie bieten sich ja für Werte an, die zum Beispiel eine Anzahl oder Länge darstellen. Nur bekommt man leider folgende Warnung, wenn man Cardinals Standardroutinen übergibt, die Integer erwarten:
Code:
[Warnung] Unit1.pas(33): Vorzeichenbehaftete und -lose Typen werden kombiniert - beide Operanden werden erweitert
Und dass der bei jeder Operation mit einem Integer und Cardinal ein Int64 draus macht, passt mir nicht so wirklich. :?
Wie seht ihr das?

Gruss
Shaman

stefan2005 6. Feb 2005 10:55

Re: Cardinal anstatt Integer?
 
hi,
also wenn ich Cardinals an Proceduren übergebe, die Integers erwarten, kommt bei mir gar keine Warnung und alles läuft auch normal !

cu,
stefan2005

Oxmyx 6. Feb 2005 11:45

Re: Cardinal anstatt Integer?
 
Du kannst den Cardinal doch zu einem Integer casten, dann kommt der Hinweis nicht mehr.

bigg 6. Feb 2005 12:22

Re: Cardinal anstatt Integer?
 
Cardinal unterstützt keine negativen Werte, Integer schon.
Beide Typen sind zwar gleich groß, haben aber unterschiedliche Wertebereiche.

Binärbaum 6. Feb 2005 23:23

Re: Cardinal anstatt Integer?
 
Der Typ Integer ist mit Vorzeichen und deckt den Wertebereich von -2147483648 bis 2147483647 ab, Cardinal ist vorzeichenlos und hat einen Bereich von 0 bis 4294967295. Beide Typen sind 32 Bit groß.
Eigentlich müssten alle Prozeeduren/ Funktionen, die Integer als Parameter akzeptieren auch Cardinal akzeptieren. Daher nehme ich z.B. wenn ich weiß, dass ein ganzzahliger Wert in meinem Programm nur größer oder gleich null sein kann Cardinal statt Integer (=LongInt). Probleme hatte ich damit bis jetzt keine.

MfG
Binärbaum

DelphiFreund 7. Feb 2005 00:35

Re: Cardinal anstatt Integer?
 
Soweit ich weiss kommt diese Meldung nur, wenn man bsp.

Delphi-Quellcode:
var
  a: Cardinal;
  c. b: Integer;
begin
  c:= a - b;
end;
rechnet.

Cöster 3. Sep 2006 14:31

Re: Cardinal anstatt Integer?
 
Ich krieg die Warnung immer, wenn ich von GetTickCount einen Integerwert subtrahiere. Wenn ich allerdings vorher GetTickCount unter einer Variablen des Typs Integer speicher und dann davon subtrahiere, kommt die Warnung nicht.

Meine Frage deswegen:

Ist es vor-, nachteilhaft oder egal, ob ich GetTickCount vorher unter einer Variablen des Typs Integer speicher?

3_of_8 3. Sep 2006 14:34

Re: Cardinal anstatt Integer?
 
Nachteilhaft. GetTickCount liefert ein unsigned DWORD und ein Integer ist signed. Bei einem Vergleich gehts noch, da dann auf Int64 erweitert wird, was aber auch Performance kostet. Daher auch die Warnung vom Compiler.

Wenn du einem Integer den Wert von GetTickCount zuweist, dürftest du ein Problem mit Werten >2^16-1 bekommen.

omata 3. Sep 2006 14:36

Re: Cardinal anstatt Integer?
 
In solchen Fällen benutze ich immer Delphi-Referenz durchsuchenABS().

Gruss
Thorsten

3_of_8 3. Sep 2006 14:38

Re: Cardinal anstatt Integer?
 
Bei GetTickCount ist es besser, gleich mit Cardinals zu arbeiten.

omata 3. Sep 2006 14:42

Re: Cardinal anstatt Integer?
 
Wenn man ein eigenes Delay realisieren möchte geht das zum Beispiel so...

Delphi-Quellcode:
procedure Delay(ATime:Integer);
var Start : integer;
begin
  Start := GetTickCount;
  repeat
    Application.ProcessMessages;
  until abs(GetTickCount) - Start > ATime;
end;
Aber warum eine negative Pause zulassen?

Also besser...
Delphi-Quellcode:
procedure Delay(ATime:Cardinal);
var Start : Cardinal;
begin
  Start := GetTickCount;
  repeat
    Application.ProcessMessages;
  until GetTickCount - Start > ATime;
end;
Gruss
Thorsten

grenzgaenger 3. Sep 2006 14:46

Re: Cardinal anstatt Integer?
 
hallo Shaman,

wieso willst du cardinal verwenden?

wenn ich das beispiel von DelphiFreund etwas erweitere kommt folgendes heraus:

Delphi-Quellcode:
var
  a: cardinal;
  b, c: integer;
begin
  a:= 19; c := -3;
  b := a - c;
  writeln(b);
end.

22


da er den kleineren Wert (hier integer) in den grösseren wert konvertiert, verliert er das vorzeichen. daher spukt der compiler eine fehlermeldung aus. tja, in diesem falle wohl nicht ganz zu unrecht...

3_of_8 3. Sep 2006 14:49

Re: Cardinal anstatt Integer?
 
Das stimmt nicht ganz. Integer und Cardinal sind gleich groß (32 Bit). Nur der Bereich ist verschoben:

Integer: -2^31 bis +2^31-1
Cardinal: 0 bis 2^32-1

Das heißt praktisch: b bleibt ein Integer. Und wenn a=4000000000 und b=42 sind, dann dürfte es krachen.

Dax 3. Sep 2006 15:03

Re: Cardinal anstatt Integer?
 
Zitat:

Zitat von 3_of_8
Integer: -2^16 bis +2^16-1
Cardinal: 0 bis 2^32-1

Good lot :shock: Junge, schau mal in die Hilfe!

Cardinal = 0..2^32-1
Integer = -2^31..2^31-1

Ein Integer ist nichts weiter als ein Cardinal, dessen Bit 31 als Vorzeichenbit "missbraucht" wird.

3_of_8 3. Sep 2006 15:06

Re: Cardinal anstatt Integer?
 
Argh...

Sorry... Aber an der Grundaussage meines Beitrages ändert sich nichts.

Cöster 3. Sep 2006 16:33

Re: Cardinal anstatt Integer?
 
Zitat:

Zitat von 3_of_8
Bei GetTickCount ist es besser, gleich mit Cardinals zu arbeiten.

Nicht immer möglich, wenn man z.B.
Delphi-Quellcode:
GetTickCount - TrackBar1.Position
rechnet, weil TrackBar1.Position Integer ist. Bei
Delphi-Quellcode:
GetTickCount - Abs(TrackBar1.Position)
wird weiterhin die Warnung angezeigt.
Wenn ich
Delphi-Quellcode:
Abs(GetTickCount) - TrackBar1.Position
rechne, tritt der Fehler nicht auf.
Ich versteh irgendwie nicht, warum. :gruebel:
GetTickCount müsste doch vom Typ Cardinal sein. Dann ist Abs(GetTickCount) doch eigentlich das Gleiche wie GetTickCount, weil Abs ja nur das Vorzeichen weglässt (was GetTickCount doch sowieso nicht hat).
In der Delphi-Hilfe zu Abs steht außerdem, dass die Zahl in den Klammern Integer oder Real sein muss. Deswegen wunder ich mich, warum ich keinen Inkompatible-Typen-Fehler krieg :gruebel:

3_of_8 3. Sep 2006 16:36

Re: Cardinal anstatt Integer?
 
Aber Abs gibt nen Integer zurück...


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:55 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