----- Original Message ----- From: "Harald Houppermans" <[EMAIL PROTECTED]> To: <[EMAIL PROTECTED]> Sent: Friday, September 24, 2004 3:19 AM Subject: Re: [fpc-pascal]Apple Mac pointer problem
> > ----- Original Message ----- > From: "Harald Houppermans" <[EMAIL PROTECTED]> > To: <[EMAIL PROTECTED]> > Sent: Friday, September 24, 2004 3:06 AM > Subject: Re: [fpc-pascal]Apple Mac pointer problem > > > > > > > > > > ----- Original Message ----- > > From: "Stephen Downs" <[EMAIL PROTECTED]> > > To: <[EMAIL PROTECTED]> > > 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 > a > > 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 :) For a second there... I thought testDataHdl is a pointer to data... But my first posting was correct... it's a pointer to a pointer to data. Are you sure you want that ? Maybe you should try changing the declarion from: testDataHandle = ^testDataPointer; to this: testDataHandle = ^testData; Now the type points directly to the data. And then the routine call should probably be: OSError := FSRead(fileRefNum, numberOfBytes, testDataHdl ) So the real problem with your code... might be that it is missing a piece of allocated memory. test data is probably allocated test data handle pointer is allocated. but the pointer in between is missing. +----------------+ +-----------------+ +----------+ | test data handle | ->| test data pointer | -> | test data | +----------------+ +-----------------+ +----------+ ( By changing the declarion like i mentioned the problem could be solved ;) ) Though it depends on what this routine does: testDataHandle(NewHandleClear(sizeof(testData))); It seems to be just clearing the data... Maybe you should post some more code... how the structure and pointers are allocated. And maybe a description of the routine and it's prototype ;) So to me it seems the structures etc are a bit f*cked up ;) If that's not the case... and you are 100% sure you know what you doing yhen it's probably something totally else... and I should just butt out... lol. Bye, Skybuck. _______________________________________________ fpc-pascal maillist - [EMAIL PROTECTED] http://lists.freepascal.org/mailman/listinfo/fpc-pascal