Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   FreePascal (https://www.delphipraxis.net/74-freepascal/)
-   -   InterlockedCompareExchange in FreePascal (https://www.delphipraxis.net/183379-interlockedcompareexchange-freepascal.html)

Alter Mann 6. Jan 2015 10:45

InterlockedCompareExchange in FreePascal
 
Hallo,

ich habe ein kleines (verständniss) Problem:(
Code:
...
Target, NewValue : Pointer;
...
if InterlickedCompareExchange(Target, NewValue, nil) <> nil then //<< Hier
...
Hier bekomme ich immer den Hinweis, dass das 3. Arg. ein Pointer ist, aber ein Longint erwartet wird.
Gehe ich mit der Maus über die betreffende Zeile verweist er im Hint auf die
systemh.inc Zeile 1014,10 und dort steht die folgende Deklaration:
Code:
function InterlockedCompareExchange(var Target : Pointer; NewValue : Pointer; Comperand: Pointer): Pointer;
Was mache ich also falsch bzw. was muss ich dem Compiler mitteilen damit
der Code durchläuft?

Danke

mkinzler 6. Jan 2015 10:53

AW: InterlockedCompareExchange in FreePascal
 
Gibt es die Funktion noche inmal in einer anderen Unit?

Alter Mann 6. Jan 2015 11:42

AW: InterlockedCompareExchange in FreePascal
 
Ich habe mal nach geschaut:

in der jwawinbase.pas als
Code:
function InterlockedCompareExchange64(var Destination: LONGLONG; Exchange, Comperand: LONGLONG): LONGLONG; stdcall;
in der c:\lazarus\fpc\2.6.4\source\rtl\i386\i386.inc als
Code:
function InterlockedCompareExchange(var Target: longint; NewValue: longint; Comperand: longint): longint; assembler;
asm
        xchgl  %eax,%ecx
        lock
        cmpxchgl  %edx, (%ecx)
end;
Und wie schon geschrieben in der systemh.inc.

Da ich keine der Units bewust eingebunden habe, sollte also eigentlich die System greifen.

Alter Mann 6. Jan 2015 11:54

AW: InterlockedCompareExchange in FreePascal
 
Hallo,

ich habe die Sache auf eine andere Art gelöst, ist aber nicht so schön:(
Code:
function InterlockedCompareExchangePtr(var Target : Pointer; NewValue : Ponter; Comperad . Pointer): Pointer;
var
  TV, NV, CO : Longint;
begin
  TV := Longint(Target);
  NV := Longint(NewValue);
  CO := Longint(Comperad);
  Result := Pointer(InterlockedCompareExchange(TV, NV, CO));
end;
Der Typecast musste sein, da der Compiler bei einem
Code:
InterlockedCompareExchange(Longint(Target), Longint(NewValue), Longint(Comperad))
das der Variablen und keine Konstanten haben möchte.

Mal schauen ob die Lösung auch die Lösung ist.

Danke

JamesTKirk 7. Jan 2015 06:26

AW: InterlockedCompareExchange in FreePascal
 
Kann es sein, dass du auch die Windows Unit eingebunden hast? Die deklariert nämlich nur eine LongInt-Variante ohne jedoch
Delphi-Quellcode:
overload
anzugeben und verbirgt damit die Deklarationen aus der System Unit. Wenn dem so ist, dann probier doch mal statt nur
Delphi-Quellcode:
InterlockedCompareExchange
den absoluten Namen
Delphi-Quellcode:
System.InterlockedCompareExchange
anzugeben.

Gruß,
Sven


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