[Lazarus] Pointer type handling

2013-12-09 Thread Leonardo M . Ramé
Hi, I'm passing a pointer buffer as void * to a C library that returns
Uint8 or Uint16 (and signed types).

If I explicitly declare the buffer as PByte, PWord, etc. I get exactly
what I need, but, I would like to work with an abstract type (for
example Pointer) and cast it depending on a flag returned by the
library.

If I pass a Pointer (instead of a PWord or PByte) and cast it to PWord,
for example. I get the same result if I have passed a PByte.

How can I handle a situation like this without explicitly define each
type?.

Regards,
-- 
Leonardo M. Ramé
http://leonardorame.blogspot.com

--
___
Lazarus mailing list
Lazarus@lists.lazarus.freepascal.org
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus


Re: [Lazarus] Pointer type handling

2013-12-09 Thread Hans-Peter Diettrich

Leonardo M. Ramé schrieb:

Hi, I'm passing a pointer buffer as void * to a C library that returns
Uint8 or Uint16 (and signed types).

If I explicitly declare the buffer as PByte, PWord, etc. I get exactly
what I need, but, I would like to work with an abstract type (for
example Pointer) and cast it depending on a flag returned by the
library.

If I pass a Pointer (instead of a PWord or PByte) and cast it to PWord,
for example. I get the same result if I have passed a PByte.

How can I handle a situation like this without explicitly define each
type?.


I'm not sure what you mean. How does your code look like now, and how do 
you want it to look?


You can modify the function declarations in your units, to accept the 
properly typed pointer or an Var parameter.


DoDi


--
___
Lazarus mailing list
Lazarus@lists.lazarus.freepascal.org
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus


Re: [Lazarus] Pointer type handling

2013-12-09 Thread Leonardo M . Ramé
On 2013-12-09 16:24:22 +0100, Hans-Peter Diettrich wrote:
 Leonardo M. Ramé schrieb:
 Hi, I'm passing a pointer buffer as void * to a C library that returns
 Uint8 or Uint16 (and signed types).
 
 If I explicitly declare the buffer as PByte, PWord, etc. I get exactly
 what I need, but, I would like to work with an abstract type (for
 example Pointer) and cast it depending on a flag returned by the
 library.
 
 If I pass a Pointer (instead of a PWord or PByte) and cast it to PWord,
 for example. I get the same result if I have passed a PByte.
 
 How can I handle a situation like this without explicitly define each
 type?.
 
 I'm not sure what you mean. How does your code look like now, and
 how do you want it to look?
 
 You can modify the function declarations in your units, to accept
 the properly typed pointer or an Var parameter.
 
 DoDi
 

If you mean overloading functions, that is exactly what I don't want to
do.

My methods are similar to this:

procedure TImageDrawer.Draw(ABuffer: PWord);
begin
  ...
end;

As you can see, I'm passing a PWord, this works as expected, the same if
I modify the funcion passing a PByte. But, as I cannot create a new
function for each pointer type, I would like to pass a generic pointer,
and typecast it inside the function, for example:

procedure TImageDrawer.Draw(ABuffer: Pointer);
begin
  ...
  if MyImage.DataType = Uint16 then
data = PWord(ABuffer)^
  else
  if MyImage.DataType = Uint8 then
data = PByte(ABuffer)^;
end;

If I do this, the result of PWord(ABuffer) is the same as
PByte(ABuffer). I'm starting to think PByte is equal to Pointer type.

-- 
Leonardo M. Ramé
http://leonardorame.blogspot.com

--
___
Lazarus mailing list
Lazarus@lists.lazarus.freepascal.org
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus