[fpc-pascal]Linked List/ pointers/ casting/ OOP Question
Anton Tichawa
anton.tichawa at chello.at
Sat Jul 10 01:57:34 CEST 2004
Hello!
Ron Weidner wrote:
>I thought I was getting closer to understanding
>pointers but it appears that I'm still not getting it.
> I wrote the following code fragment but it doesn't
>compile. the errors I get are...
>
>Widget_container_class.pas(80,27) Error: Illegal
>qualifier
>Widget_container_class.pas(88,23) Error: Illegal
>qualifier
>Widget_container_class.pas(88,29) Error: Illegal
>expression
>Widget_container_class.pas(88,29) Fatal: Syntax error,
>";" expected but "(" found
>
>I numbered lines 80 and 88 in comments so that the
>error messages make sense. (to the experienced
>programmer like yourself :) )Please let me know if you
>see what the problems are.
>
>{$H+}
>unit Widget_container_class;
>interface
>uses
>Attribute_class,Widget_class,Widget_entity_class,web;
>type PWidgetList=^TWidgetList;
>TWidgetList=record
> widget:pointer;
> next:PWidgetList;
>end;
>
>type PWidgetContainer=^TWidgetContainer;
>TWidgetContainer=Object(TWidget)
> private
> PCurWidget,PHeadWidget:PWidgetList;
> text:string;
> public
> constructor init(ATag:string);
> procedure Render();
> procedure SetText(str:string);
> function GetText():string;
> procedure MoveFirstWidget();
> procedure MoveLastWidget();
> procedure AddWidget(PWidget:pointer);
> procedure RenderWidgets();
>end;
>
>procedure TWidgetContainer.RenderWidgets();
>begin
> MoveFirstWidget();
> while (PCurWidget^.next <> nil) do
> begin
> PCurWidget^.widget:=PWidget(PCurWidget^.widget); //
>cast the pointer to a widget pointer
> if (PCurWidget^.widget^.meta = 'ENTITY') then //
>this is line 80
> begin
>
>PCurWidget^.widget:=PWidgetEntity(PCurWidget^.widget);
> end
> else
> begin
>
>PCurWidget^.widget:=PWidgetContainer(PCurWidget^.widget);
> end;
> PCurWidget^.widget^.Render(); //line 88
> PCurWidget:=PCurWidget^.next;
> dispose(PHeadWidget);
> PHeadWidget:=PCurWidget;
> end;
>end;
>
>Ron_W
>
>
>
>__________________________________
>Do you Yahoo!?
>New and Improved Yahoo! Mail - Send 10MB messages!
>http://promotions.yahoo.com/new_mail
>
>_______________________________________________
>fpc-pascal maillist - fpc-pascal at lists.freepascal.org
>http://lists.freepascal.org/mailman/listinfo/fpc-pascal
>
>
>
The type cast actually does nothing at runtime, so the line
PCurWidget^.widget:=PWidget(PCurWidget^.widget); //
does nothing.
Type casts are just to inform the compiler, at compile time, to accept a
type for some variable or constant it would otherwise reject.
So, you have to typecast where you use it, i. e. -everywhere- you use it.
Instead of:
PCurWidget^.widget:=PWidget(PCurWidget^.widget); //
if (PCurWidget^.widget^.meta = 'ENTITY') then //
try:
if (PWidget(PCurWidget^.widget)^.meta = 'ENTITY') then //
Note: I don't see the definition of PWidget in your code peace. I assume
it's a pointer to a record containing a string member named meta. But in
your procedure
procedure AddWidget(PWidget:pointer);
you use the very same identifier, PWidget, for a variable name. That's a
bit confusing.
hth,
Anton.
More information about the fpc-pascal
mailing list