Intergertypen in sich konvertieren

Für Fragen von Einsteigern und Programmieranfängern...

Intergertypen in sich konvertieren

Beitragvon af0815 » 21. Feb 2018, 14:43 Intergertypen in sich konvertieren

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).
af0815
 
Beiträge: 3472
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: FPC 3.2 Lazarus 2.0 per fpcupdeluxe | 
CPU-Target: 32Bit (64Bit)
Nach oben

Beitragvon Michl » 21. Feb 2018, 15:23 Re: Intergertypen in sich konvertieren

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; 
Michl
 
Beiträge: 2260
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon af0815 » 21. Feb 2018, 16:25 Re: Intergertypen in sich konvertieren

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).
af0815
 
Beiträge: 3472
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: FPC 3.2 Lazarus 2.0 per fpcupdeluxe | 
CPU-Target: 32Bit (64Bit)
Nach oben

Beitragvon mse » 21. Feb 2018, 16:43 Re: Intergertypen in sich konvertieren

Mit expliziter Typenkonvertierung, z.B.
Code: Alles auswählen
 
    Font.Color := TFPReportColor(AReader.ReadInteger('FontColor', integer(Font.Color)));
 

(ungeprüft!)
mse
 
Beiträge: 1967
Registriert: 16. Okt 2008, 09: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
Nach oben

Beitragvon af0815 » 21. Feb 2018, 21:59 Re: Intergertypen in sich konvertieren

@ 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).
af0815
 
Beiträge: 3472
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: FPC 3.2 Lazarus 2.0 per fpcupdeluxe | 
CPU-Target: 32Bit (64Bit)
Nach oben

Beitragvon mse » 22. Feb 2018, 08:56 Re: Intergertypen in sich konvertieren

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?
mse
 
Beiträge: 1967
Registriert: 16. Okt 2008, 09: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
Nach oben

Beitragvon af0815 » 23. Feb 2018, 07:33 Re: Intergertypen in sich konvertieren

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).
af0815
 
Beiträge: 3472
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: FPC 3.2 Lazarus 2.0 per fpcupdeluxe | 
CPU-Target: 32Bit (64Bit)
Nach oben

Beitragvon mse » 23. Feb 2018, 08:28 Re: Intergertypen in sich konvertieren

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.
mse
 
Beiträge: 1967
Registriert: 16. Okt 2008, 09: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
Nach oben

• Themenende •

Zurück zu Einsteigerfragen



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 Gäste

porpoises-institution
accuracy-worried