it would be nice if something like this is possible:
Code: Select all
If Type = 1
*ptr.Type1Str = *Buffer
else
*ptr.Type2Str = *Buffer
endif
Code: Select all
If Type = 1
*ptr.Type1Str = *Buffer
else
*ptr.Type2Str = *Buffer
endif
Code: Select all
Structure BothTypes
StructureUnion
Type1.Type1Str
Type2.Type2Str
EndStructureUnion
EndStructure
*ptr.BothTypes = *Buffer
If Type = 1
*ptr\Type1\...
Else
*ptr\Type2\...
EndIf
Code: Select all
If ChannelRecordSize = 100
ReadChannel.Prototype_ReadChannel = @ReadChannel100()
ElseIf ChannelRecordSize = 476
ReadChannel.Prototype_ReadChannel = @ReadChannel476()
EndIf
Code: Select all
Procedure ReadChannel100(*Channel.Channel100Str)
Code: Select all
Procedure ReadChannel476(*Channel.Channel476Str)
Code: Select all
Structure ChannelBase
; base elements
EndStructure
Structure Channel100Str Extends ChannelBase
; 100Str specific elements
EndStructure
Structure Channel476Str Extends ChannelBase
; 476Str specific elements
EndStructure
Procedure ReadChannel( *Channel.ChannelBase )
; ....
EndProcedure
; ....
ReadChannel( *ptr100Str )
; ....
ReadChannel( *ptr476Str )
; ....
Code: Select all
Structure BothTypes
StructureUnion
AnonymousStructure Type1Str
AnonymousStructure Type2Str
EndStructureUnion
EndStructure
*ptr.BothTypes = *Buffer
Code: Select all
Structure BothTypes
StructureUnion
AnonymousStructure ;Type1Str
......
EndAnonymousStructure
AnonymousStructure ;Type2Str
......
EndAnonymousStructure
EndStructureUnion
EndStructure
If what you say is true (the procedures are actually, truly, identical) then, by definition, one structure must be a subset of the other, else field lookup wouldn't work. In this case, just pass in the address of the variable + the offset in the structure where the subset starts, and it will work regardless of declared structure.infratec wrote:But I need 2 procedures which are completely identical up to the structure which I use for the pointer:Code: Select all
Procedure ReadChannel100(*Channel.Channel100Str)
BerndCode: Select all
Procedure ReadChannel476(*Channel.Channel476Str)
Code: Select all
Structure Channel100Str
Name.s{32}
Dummy0.a[12]
Transponder.a
Dummy1.a[15]
ServiceID.u
EndStructure
Structure Channel476Str
Name.s{32}
Dummy0.a[12]
Transponder.a
Dummy1.a[391]
ServiceID.u
EndStructure
Prototype Prototype_ReadChannel(*Channel)
Global ReadChannel.Prototype_ReadChannel
Procedure ReadChannel100(*Channel.Channel100Str)
Channel$ = *Channel\Name + #LF$
Channel$ + Str(*Channel\Transponder) + #LF$
Channel$ + Str(*Channel\ServiceID)
AddGadgetItem(0, -1, Channel$)
EndProcedure
Procedure ReadChannel476(*Channel.Channel476Str)
Channel$ = *Channel\Name + #LF$
Channel$ + Str(*Channel\Transponder) + #LF$
Channel$ + Str(*Channel\ServiceID)
AddGadgetItem(0, -1, Channel$)
EndProcedure
Code: Select all
:
:
:
If ChannelRecordSize = 100
ReadChannel.Prototype_ReadChannel = @ReadChannel100()
ElseIf ChannelRecordSize = 476
ReadChannel.Prototype_ReadChannel = @ReadChannel476()
EndIf
ClearGadgetItems(0)
For i = 1 To Channels
ReadChannel(*Buffer + Ptr)
Ptr + ChannelRecordSize
Next i
:
:
:
Code: Select all
Structure ChannelStr
Name.s{32}
Dummy0.a[12]
Transponder.a
ServiceID.u
Dummy1_.a[0]
EndStructure
Structure Channel100Str Extends ChannelStr
Dummy1.a[15]
EndStructure
Structure Channel476Str Extends ChannelStr
Dummy1.a[391]
EndStructure
Procedure ReadChannel(*Channel.ChannelStr)
Channel$ = *Channel\Name + #LF$
Channel$ + Str(*Channel\Transponder) + #LF$
Channel$ + Str(*Channel\ServiceID)
AddGadgetItem(0, -1, Channel$)
EndProcedure
ClearGadgetItems(0)
For i = 1 To Channels
ReadChannel(*Buffer + Ptr)
Ptr + ChannelRecordSize
Next i
Nice.Trond wrote:Code: Select all
Structure ChannelStr Name.s{32} Dummy0.a[12] Transponder.a ServiceID.u ; Dummy1_.a[0] ;<-- If you omit this, I assume the code will fail? ; EndStructure Structure Channel100Str Extends ChannelStr Dummy1.a[15] EndStructure Structure Channel476Str Extends ChannelStr Dummy1.a[391] EndStructure