Verschiedene Strukturen in einer Liste (Untyped)

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Iggels
Beiträge: 53
Registriert: 17.02.2006 21:30

Verschiedene Strukturen in einer Liste (Untyped)

Beitrag 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?
Benutzeravatar
Bisonte
Beiträge: 2465
Registriert: 01.04.2007 20:18

Re: Verschiedene Strukturen in einer Liste (Untyped)

Beitrag 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 ;) )
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Verschiedene Strukturen in einer Liste (Untyped)

Beitrag von Josh »

Code: Alles auswählen

*rawbus = AllocateMemory(SizeOf(Bus::Bus))
InitializeStructure(*rawbus ,Bus::Bus)
Schau dir mal AllocateStructure() an
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Verschiedene Strukturen in einer Liste (Untyped)

Beitrag von RSBasic »

[offtopic]
@Iggels
Willkommen zurück :allright:
[/offtopic]
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Antworten