[Lazarus] Pointer type handling

Leonardo M. Ramé l.rame at griensu.com
Mon Dec 9 16:35:33 CET 2013


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




More information about the Lazarus mailing list