I'm having a problem getting the compiler to accept a fairly simple compound object reference, of this form:
PrintTree oNode.LeftNode, sOrder
Prototype: SUB PrintTree(BYVAL oNode as iface_Node, BYVAL sOrder AS STRING)
However, the same compound reference (oNode.LeftNode) works with this subroutine prototype:
PrintTree oNode.LeftNode
Prototype: SUB PrintTree(BYVAL oNode as iface_Node)
In the first case, I get a compiler error indicating that "Parameter mismatches definition", but the oNode.LeftNode expression should return a reference to iface_Node, which the subroutine is expecting.
In the second case, as long as I have no additional parameters defined to pass to the subroutine, the same expression compiles (and works) just fine.
Am I doing something wrong? The problem causes me to have to call the PrintTree routine (as defined in case 1 above) as follows:
DIM oLeftNode as iface_Node
oLeftNode = oNode.LeftNode
PrintTree oLeftNode, sOrder
This works, but results in unnecessarily complicated code, and requires an additional object reference to be defined and created.
More complete (pastable) code examples follow:
This code compiles (note: code doesn't do anything - I've removed all code unnecessary to demonstrate any problem except the compile-time exception).
Code:
#COMPILE EXE #DIM ALL CLASS Node INSTANCE pLeftNode AS iface_Node INSTANCE pRightNode AS iface_Node INSTANCE pValue AS LONG INTERFACE iface_Node INHERIT IUNKNOWN PROPERTY GET LeftNode AS iface_Node PROPERTY = pLeftNode END PROPERTY PROPERTY GET RightNode AS iface_Node PROPERTY = pRightNode END PROPERTY PROPERTY GET Value AS LONG PROPERTY = pValue END PROPERTY END INTERFACE END CLASS SUB PrintTree(BYVAL oNode AS iface_Node) IF ISNOTHING(oNode) THEN EXIT SUB PrintTree oNode.LeftNode STDOUT FORMAT$(oNode.Value) PrintTree oNode.RightNode END SUB FUNCTION PBMAIN () AS LONG DIM oNode AS iface_Node PrintTree oNode END FUNCTION
Code:
#COMPILE EXE #DIM ALL CLASS Node INSTANCE pLeftNode AS iface_Node INSTANCE pRightNode AS iface_Node INSTANCE pValue AS LONG INTERFACE iface_Node INHERIT IUNKNOWN PROPERTY GET LeftNode AS iface_Node PROPERTY = pLeftNode END PROPERTY PROPERTY GET RightNode AS iface_Node PROPERTY = pRightNode END PROPERTY PROPERTY GET Value AS LONG PROPERTY = pValue END PROPERTY END INTERFACE END CLASS SUB PrintTree(BYVAL oNode AS iface_Node, BYVAL sOrder AS STRING) DIM i AS LONG IF ISNOTHING(oNode) THEN EXIT SUB FOR i = 1 TO LEN(sOrder) SELECT CASE MID$(sOrder,i,1) CASE "1" PrintTree oNode.LeftNode, sOrder CASE "2" STDOUT FORMAT$(oNode.Value) CASE "3" PrintTree oNode.RightNode, sOrder END SELECT NEXT i END SUB FUNCTION PBMAIN () AS LONG DIM oNode AS iface_Node PrintTree oNode, "123" 'Print tree in pre-order sequence PrintTree oNode, "321" 'Print tree in post-order sequence PrintTree oNode, "213" 'Print tree in in-order sequence END FUNCTION