[fpc-pascal] units order (was using oldlinux )
Alain Vitry
alain.vitry at gmail.com
Tue Jun 14 10:45:26 CEST 2005
Thanks for the answer.
But is that by design ?
Let' look at this case (not the best design, but big legacy):
File common.pas:
uses StandardFile, MacWindows;
...
var MaPict: array[WPictWind_1..WPictWind_3] of PicHandle;
File utils.pas:
uses commons, MacWindows, SegLoad, Quickdraw, StandardFile;
...
var PictRect: Rect;
...
DrawPicture(PictArray[i], PictRect);
Compilation:
Utils.pas(316,29) Error: Incompatible type for arg no. 1: Got
"MACWINDOWS.PicHandle", expected "STANDARDFILE.PicHandle"
I know about unit propagation. PicHandle is first defined in
MacWindows, then used in standardfile.
The best solution I've found is to suffle units around, altough I find
this approach inelegant.
Renaming every occurence of some types is a better solution, altough
very intrusive.
Shouldn't type A defined in unit X be fixed whether units Y, Z who also
use it are included or not in my program ?
Also when unit Y defines a procedure with type A (from unit X) as
parameter, shouldn't type A still refer to the type A as defined in
unit X, and not become some types like Y.A ?
It is unclear to me, why this problem occur in the first place (In this
case there is no re-definition of the types, as for oldlinux)
Kind regards,
Alain
Le 14 juin 05, à 10:07, Vincent Snijders a écrit :
> Alain Vitry wrote:
>> Le 14 juin 05, à 09:46, Michael Van Canneyt a écrit :
>>>
>>> You must switch the order of the units, because you get the
>>> 'oldlinux' types which
>>> you try to use in 'baseunix' functions.
>>>
>>>
>> This unit order trick is a bit of a wizardery to me. It quickly get
>> very messy in a large enough program to swap units order until you
>> get the one which doesn't break.
>> In the sw I'm porting, almost every single UPI type is re-defined in
>> many units, which makes FPC complain about types.
>> Am I missing some switches or some pascal features, with my kernel
>> hacker mind ?
>
> You can also specify from which unit you want to use the
> type/procedure/function/constant.
>
> Suppose both unit A and unit B declare a procedure DoIt;
>
> You could do something like this:
> program p;
>
> uses A, B;
> begin
> A.DoIt; // calls DoIt in unit a
> B.DoIt; // calss DoIt in unit b
> end;
>
>
> Vincent.
>
> _______________________________________________
> fpc-pascal maillist - fpc-pascal at lists.freepascal.org
> http://lists.freepascal.org/mailman/listinfo/fpc-pascal
>
More information about the fpc-pascal
mailing list