Seite 1 von 1

Verschiedene Strukturen in einer Liste (Untyped)

Verfasst: 03.11.2015 02:03
von Iggels
Nach längerer Zeit hab ich mich mal wieder an PB gewagt und war begeistert was sich alles getan hat.

Ich bin auch auf die Möglichkeit gestoßen Variablen mit unterschiedlicher Struktur gemeinsam in einer Liste zu speichern.
Nun bin ich mir nicht sicher ob das so in Orndung ist oder ob sich das in zukünfitgen PB Versionen ändern könnte.
Um das zu erreichen verwende ich InitializeStructure und den Hinweis "There is no internal check to ensures the structure match the memory area."

Hier das Beispiel:

Code: Alles auswählen

DeclareModule Car
  Structure Car
    name.s
    speed.l
  EndStructure 
  Declare showInfo(*self.Car)
  Declare.s getName(*self.Car) 
EndDeclareModule

Module Car
  Procedure showInfo(*self.Car)
    MessageRequester("",*self\name+"  Speed:"+Str(*self\speed))
  EndProcedure
  Procedure.s getName(*self.Car)
    ProcedureReturn *self\name
  EndProcedure
EndModule


; Normales Objekt
*vw.Car::Car = AllocateStructure(Car::Car)
*vw\name = "VW"
*vw\speed = 180
;Car::showInfo(*vw)


; Bus erhält die gleiche Basis-Struktur wie Car mit Structure Extends 
DeclareModule Bus
  Structure Bus Extends Car::Car
    seats.l
  EndStructure 
  Declare showInfo(*self.Bus)
EndDeclareModule
Module Bus
  Procedure showInfo(*self.Bus)
    MessageRequester("",*self\name+"  Speed: "+Str(*self\speed)+"   Seats: "+Str(*self\seats))
  EndProcedure
EndModule

; HIER ist der entscheidende Punkt, mit InitializeStructure kann ein Pointer auf eine beliebige Structure zeigen, *rawbus hat keinen Typ

*rawbus = AllocateMemory(SizeOf(Bus::Bus))
InitializeStructure(*rawbus ,Bus::Bus)

; Man kann daher allerdings auch nicht direkt auf die Felder zugreigen, man benötigt einen Zeiger mit Typ, der kann allerdings eben auch aus dem Supermodul sein

;Bus als Auto
*car.Car::Car = *rawbus
*car\name = "VW Bus als Auto"
*car\speed = 100
;Car::showInfo(*rawbus)

*rawbus = AllocateMemory(SizeOf(Bus::Bus))
InitializeStructure(*rawbus ,Bus::Bus)

;Bus als Bus
*bus.Bus::Bus = *rawbus
*bus\name = "VW Bus"
*bus\speed = 1000
*bus\seats = 110

;Bus::showInfo(*rawbus)

; Jetzt kommt das Auto zusammen mit dem Bus in EINE Liste :D

NewList cars()
AddElement(cars())
cars() = *vw

AddElement(cars())
cars() = *car

AddElement(cars())
cars() = *bus


ForEach cars()
  Car::showInfo(cars())
Next 




Ist davon auszugehen das dieser Code auch in zukünftigen Versionen noch funktioniert oder wird InitializeStructure sich ggf. ändern?

Re: Verschiedene Strukturen in einer Liste (Untyped)

Verfasst: 03.11.2015 05:29
von Bisonte
Iggels hat geschrieben:Ist davon auszugehen das dieser Code auch in zukünftigen Versionen noch funktioniert oder wird InitializeStructure sich ggf. ändern?
Mit der LTS Version definitiv in den nächsten 2 Jahren nicht. (Die ist noch frisch ;) )

Re: Verschiedene Strukturen in einer Liste (Untyped)

Verfasst: 03.11.2015 06:16
von Josh

Code: Alles auswählen

*rawbus = AllocateMemory(SizeOf(Bus::Bus))
InitializeStructure(*rawbus ,Bus::Bus)
Schau dir mal AllocateStructure() an

Re: Verschiedene Strukturen in einer Liste (Untyped)

Verfasst: 03.11.2015 10:35
von RSBasic
[offtopic]
@Iggels
Willkommen zurück :allright:
[/offtopic]