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 - [EMAIL PROTECTED] 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.
_______________________________________________ fpc-pascal maillist - [EMAIL PROTECTED] http://lists.freepascal.org/mailman/listinfo/fpc-pascal