[fpc-pascal]Apple Mac pointer problem
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;
> 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:
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