[fpc-pascal]Apple Mac pointer problem

Harald Houppermans houppermans at home.nl
Fri Sep 24 03:19:28 CEST 2004

----- Original Message ----- 
From: "Harald Houppermans" <houppermans at home.nl>
To: <fpc-pascal at lists.freepascal.org>
Sent: Friday, September 24, 2004 3:06 AM
Subject: Re: [fpc-pascal]Apple Mac pointer problem

> ----- Original Message ----- 
> From: "Stephen Downs" <stephend at e-tempest.co.uk>
> To: <fpc-pascal at lists.freepascal.org>
> Sent: Thursday, September 23, 2004 8:49 PM
> Subject: [fpc-pascal]Apple Mac pointer problem
> I am porting a Mac CodeWarrior project to FreePascal and have hit a
> compile problem with a pointer. In my original code I have a structure
> defined along the lines of
> testData = record
>    testIndex :  array [0..12] of integer;
> end;
> testDataPointer = ^testData;
> testDataHandle = ^testDataPointer;
> Within my main code I open a file and try to read it into my structure
> testDataHdl := testDataHandle(NewHandleClear(sizeof(testData)));
> OSError := FSRead(fileRefNum, numberOfBytes, testDataHdl^)
> The FSRead line fails with error: 62: Incompatible type for arg no. 3:
> Got "testDataPointer", expected "Ptr" - the third parameter for FSRead is
> pointer. I presume this is because FreePascal uses typed pointers. I
> tried replacing testDataHdl^ by Ptr(testDataHdl)^ but that gives a
> similar error - Got "ShortInt", expected "Ptr"
> Does anyone know how I can get around this?
> regards... Steve
> Euhm... just my two cents:
> testDataHdl is in fact a pointer to a pointer to data.
> so testDataHdl^ points to a pointer.
> If you want to read a pointer from the file that's good.
> But if you actually want to read the data then it's a mistake.
> Then you need to use this:
> testDataHdl^^
> Bye,
>   Skybuck.

Though euhm.. it depends on the way the routine really works.

It seems it's excepting pointers.

So testDataHdl^ seems correct... since that will supply the routine with a
pointer to the data.

Maybe the prototype is incorrect ?

You can always try testDataHdl^^ and see if it works ;) lol.

Though looking at the code again... why is testDataPointer declared (it
doesn't seem to be used) ?

In other words...

1. Does the routine expect a pointer to data ?
2. Does the routine expect a pointer to a pointer to data ?
3. Or does the routine expect like a var parameter... that means the data
itself... like a const reference or something ;)

For example pascal and delphi file routines and streams work with number 3

In your case it seems the routine work with number 1.

That means testDataHdl^ is simply a mistake.

Since you are now dereferencing it to the data.

The routine doesn't want the data... the routine wants a pointer.

So the correct call is probably something like:

OSError := FSRead(fileRefNum, numberOfBytes, testDataHdl )

testDataHdl (without the hat ^ )

The funny thing is the declaration of the testDataPointer put you, me and
everybody else off ;)

It's simply misleading :)


More information about the fpc-pascal mailing list