[fpc-pascal] cdecl calling and const parameters - was SizeOf(File) <> SizeOf(FileRec)

Søren Ager sorenager at poboxes.com
Wed May 25 09:29:00 CEST 2005


Tomas Hajny wrote:

> I believe the C const construct (const declaration in a call marked 
> as cdecl) is wrongly used in so32dll.connect (the meaning of this 
> construct in C is different from the Pascal "const" modifier).

I am programming in Pascal so I can't see what C has to do with it ;-) 
I am only interested in changing the caling convention - not the meaning 
of the const which should be the same as var - with the exception that 
you are not allowed to change the parameter. So you are saying there is 
no way to make it behave like that? :-(

> If address of the record should be passed, use either "var" modifier

That works - but it is not optimal as I have to double buffer all calls 
in the standard units from const to var. Sockets.pas:

Function Connect(Sock:Longint;const Addr; Addrlen:Longint):Boolean;
var
   sa : so32dll.SockAddr;
begin
   sa:=so32dll.SockAddr(Addr);
   Connect:=so32dll.Connect(Sock,sa,AddrLen)=0;
   if not Connect then
     SocketError:=so32dll.sock_errno
   else
     SocketError:=0;
end;

And it gets worse when I have an untyped buffer (as send does) - then I 
will have to allocate memory - copy the contents - call the dll - 
deallocate...

> depend on used compiler options, so it's probably better to add 
> explicit {$PACKRECORDS 1} to so32dll.pas.

Done

Take care,
    Soren





More information about the fpc-pascal mailing list