[erledigt] Linux und Abs()

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

[erledigt] Linux und Abs()

Beitrag von Michl »

Servus,

zum testen einer Logik eines Programms hatte ich mir in der VirtualBox diverse Linuxdistrubutionen eingerichtet. Nach diversen Tests habe ich mich für ein 64bit Debian KDE entschieden, um den Programmtest durchzuführen.
Da bei Debian per apt-get Lazarus verfügbar ist, habe ich auch gleich dieses Paket installiert (Lazarus 1.2.4+dfsg2-1 r43696 FPC 2.6.4 x86_64-linux-gtk 2).

Leider habe ich, bevor ich überhaupt loslegen kann, schon das erste Problem. Bei:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  x : QWord;
begin
  x := 123;
  Caption := IntToStr(Abs(x));
end;
Bekomme ich den Compilerfehler:

Code: Alles auswählen

unit1.pas(37,23) Error: Can't determine which overloaded function to call

Bevor ich mir FPC 3.0.0 und Lazarus 1.6 installiere, wollte ich wissen, ob das an FPC 2.6.4 oder an dem 64bit Linux liegt?
Gibt es einen Trick, dem Compiler mitzuteilen, wie er ein QWord behandeln soll und der Code compiliert (eigentlich wollte ich das BGRA-Controls-Package installieren, wo dieser Fehler sofort auftrat)?
Zuletzt geändert von Michl am Mo 30. Mai 2016, 08:28, insgesamt 1-mal geändert.

Code: Alles auswählen

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

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

Re: Linux und Abs()

Beitrag von theo »

Was wäre denn der Sinn des Ganzen?
QWord ist vorzeichenlos. Weshalb Abs?

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

Re: Linux und Abs()

Beitrag von Michl »

Das liegt an dem Typecast von BGRA:

Code: Alles auswählen

{$ifdef CPU64}
  PtrUInt = QWord;
{$endif CPU64} 
...
  NativeUint = PtrUint;     
...
function FilterEmboss(bmp: TBGRACustomBitmap; angle: single; ABounds: TRect; AStrength: integer; AOptions: TEmbossOptions): TBGRACustomBitmap;
var
  redDiff: NativeUInt;
...   
 

Ähm, aber ja, du hast Recht, unter Windows geht das ja auch nicht. Hätte ich vorher mal testen können.

OK, dann ist das ein Bug in BGRA (unter Windows kompiliert diese Version). Komisch, dass das niemanden bisher aufgefallen ist...


Danke auf jeden Fall für den Hinweis!

Code: Alles auswählen

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

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

Re: Linux und Abs()

Beitrag von Michl »

Aha, der Fehler liegt ganz woanders. Es liegt nicht an Linux vrs. Windows sondern an 32bit vrs. 64bit:

Code: Alles auswählen

program Project1;
 
var
  q: QWord;
  d: DWord;
 
begin
  Abs(d - 1)// <- das frisst der Compiler
  Abs(q - 1)// <- das nicht
end
Ist eins davon ein Bug oder beides Features?

Code: Alles auswählen

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

BeniBela
Beiträge: 309
Registriert: Sa 21. Mär 2009, 17:31
OS, Lazarus, FPC: Linux (Lazarus SVN, FPC 2.4)
CPU-Target: 64 Bit

Re: Linux und Abs()

Beitrag von BeniBela »

Michl hat geschrieben:

Code: Alles auswählen

 
begin
  Abs(d - 1)// <- das frisst der Compiler
end


Das wird wohl zu Int64 umgewandelt

Michl hat geschrieben:

Code: Alles auswählen

 
begin
  Abs(q - 1)// <- das nicht
end

Aber es gibt kein Int128 um das umzuwandeln

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

Re: Linux und Abs()

Beitrag von Michl »

BeniBela hat geschrieben:Aber es gibt kein Int128 um das umzuwandeln
Ja, so wird es sein.

Michl hat geschrieben:Ist eins davon ein Bug oder beides Features?
Ich antworte mir mal selber. Laut Jonas Maebe ist dies wohl richtig so, Zitat: "abs() is only defined for floating point types, longint and int64".

Für mein Urproblem, werde ich mal im englischen Forum nachfragen, ob BGRABitmap (Trunk) nur für 32bit geeignet ist.

Danke an alle für die Hinweise.

[Edit] für diejenigen, die es interessiert, hier ist der Link http://forum.lazarus.freepascal.org/index.php/topic,32787.msg211570

Code: Alles auswählen

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

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Linux und Abs()

Beitrag von mschnell »

theo hat geschrieben:Was wäre denn der Sinn des Ganzen?
QWord ist vorzeichenlos. Weshalb Abs?

Nicht nur "Weshalb", sondern auch "was bedeutet das ?"
Vermutlich ist das Argument von ABS als Vorzeichen-behaftet definiert. Ein vorzeichenloses Argument wird also zunächst in ein Vorzeichen-behaftetes umgewandelt, was zu einem negativen Wert führt, wenn das oberste Bit gesetzt war.

Davon ein "Abs" ist dann ein positiver Wert, aber nicht derselbe wie vorher :D

-Michael

Antworten