Intergertypen in sich konvertieren

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6200
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Intergertypen in sich konvertieren

Beitrag von af0815 »

Gibt es ein Rezept wie man die verschiedenen Typen/Größen von Integer sauber ineinander überführen kann ?

Ich habe da aktuell so meine Proble mit fpc Code, wo wild durcheinander konvertiert wird, wenn man aber Rangecheck einschaltet genaugenommen nicht funktioniert ausser Rangeerrors.

Code: Alles auswählen

 
 
  maxLongint  = $7fffffff;
.....
    const
       MaxInt  = MaxLongint;
    type
       Integer  = longint;
.....
 
  TFPReportColor  = type UInt32;
.....
const
  { The format is always RRGGBB (Red, Green, Blue) - no alpha channel }
  clNone          = TFPReportColor($80000000)// a special condition: $80 00 00 00
 
......
    AWriter.WriteInteger('FontColor', Font.Color);
.....
    Font.Color := AReader.ReadInteger('FontColor', Font.Color);
......
 
function TFPReportJSONStreamer.ReadInteger(AName: String; ADefault: Integer): Integer;
var
  d: TJSONData;
begin
  d := FindChild(AName) as TJSONData;
  if d = nil then
    Result := ADefault
  else
  begin
    if d.JSONType = jtNumber then
      Result := d.AsInt64
    else
      Result := ADefault;
  end;
end;
 
 


Irgendwie kommt mir das ganze schon wild vor, vor allen der cast von Integer zu UInt32 macht natürlich Probleme. WIe löst man sowas richtig (und sauber) ?

Andreas
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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

Re: Intergertypen in sich konvertieren

Beitrag von Michl »

Wenn es tatsächlich gewollt ist, die Prüfung in dem Bereich ausschalten: https://www.freepascal.org/docs-html/prog/progsu65.html

Code: Alles auswählen

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

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6200
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Intergertypen in sich konvertieren

Beitrag von af0815 »

Schaut mir nicht gewollt aus. Sondern eher nach - passt eh.

BTW:

Code: Alles auswählen

The {$RANGECHECKS OFF} switch tells the compiler not to generate range checking code. This may result in faulty program behaviour, but no run-time errors will be generated.


Genau deswegen ist es mir aufgefallen.

Andreas
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Intergertypen in sich konvertieren

Beitrag von mse »

Mit expliziter Typenkonvertierung, z.B.

Code: Alles auswählen

 
    Font.Color := TFPReportColor(AReader.ReadInteger('FontColor', integer(Font.Color)));
 

(ungeprüft!)

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6200
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Intergertypen in sich konvertieren

Beitrag von af0815 »

@ mse bei einer definition von $80000000 von Font.Color kracht's (geprüft) mit Rangecheck und das IMHO zurecht.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Intergertypen in sich konvertieren

Beitrag von mse »

Code: Alles auswählen

 
procedure test();
 
type
  TFPReportColor  = type UInt32;
var
 i1: integer;
 co1: tfpreportcolor;
{$rangechecks on}
begin
 i1:= integer($80000000);
 co1:= tfpreportcolor(i1);
 writeln(integer(co1));
 i1:= integer(co1);
 writeln(i1);
end;
 

Funktioniert bei mir. Kannst du ein komplettes Beispiel möglichst ohne zusätzliche units posten?

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6200
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Intergertypen in sich konvertieren

Beitrag von af0815 »

mse hat geschrieben:Funktioniert bei mir. Kannst du ein komplettes Beispiel möglichst ohne zusätzliche units posten?

Kann ich nicht, denn wenn man mein Beispiel reduziert kommt man auf dasselbe Ergebnis. Es lag eine Ebene tiefer noch ein Conversionproblem vor.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Intergertypen in sich konvertieren

Beitrag von mse »

Das heisst, mit der expliziten Typenkonvertierung bekommst du das gewünschte Verhalten so dass es nun auch "geprüft" funktioniert? ;-)
<typ>(<variable>) bedeutet: interpretiere das Bitmuster von <variable> als <typ>. Die Speichergrössen von <typ> und <variable> müssen übereinstimmen.
https://www.freepascal.org/docs-html/cu ... 16600012.5
oder
https://www.freepascal.org/docs-html/cu ... 16500012.4
für <typ>(<wert>) wo die Speichergrössen für Ordinalwerte nicht übereinstimmen müssen.

Antworten