Grundlegende Type-informationen

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

PhillipK

Betreff: Grundlegende Type-informationen

BeitragMo, Okt 25, 2010 19:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Grüße forum Smile

Nach langer zeit des stöberns und stillschweigenden proggen's melde ich mich hier mal wieder.

Da ich grade mit wem anners zusammen an einem kleinem Spiel werkel, ergibt sich auch die frage, ressourcen zu sparen.
Nach einem wenig rumgebastel, um die CPU zu entlasten, ergaben sich kleinere fragen, die allerdings nicht so ins gewicht fallen. Sie intressieren mich einfach Smile

Es geht um Types und die speicher reservierung.
Unser projekt wird mit minib3d geschrieben.. Viele dinge darin haben wir schon auf unser Projekt 'zugeschnitten', aber es gibt auch einige dinge, die sich nicht so einfach verändern lassen.

Es geht um - ihr habts erraten - Types Smile

Viele der Felder in gewissen type werden nur für kleine programmabschnitte benötigt. Abgespeckter felder kommen aber fast überall zum einsatz.
Meine frage ist nun, wie sieht die speicherreservierung aus und ob man diese - falls vorhanden - leicht verändern kann, ohne gleich eine ganze klasse zu Clonen und die funktionen abzuwandeln.

BlitzMax: [AUSKLAPPEN]

Type Gerät

Field stromverbrauch:Int = 0
Field gewicht_faktor:Float = 0

End Type


Mal ein stupides beispiel, was mir grade entsprungen ist.
Dies möchte ich extenden, aber evtl nicht alle felder nutzen (und so keinen speicher verbrauchen) oder den variablen-typ eines Feldes ändern.

Zb möchte ich mit Type Telefon extends Gerät das ganze vererben und auf 'Telefon' zurechtgestutzt nutzen.

Um es besser zu verstehen, wie genau extends wirkt und was beim erstellen eines Objektes geschieht, stelle ich hier nun einzelne fragen:

1) Initialisiert die New() methode alle Field's? Mit einem wert, mit speicherreservierung?
2) Extends 'vererbt' eine klasse -> Wird sie stupide übernommen und wirkt nur als Faulheitsbonus?
3) Gibt es eine möglichkeit, beim vererben Felder ganz wegzulassen oder den variablentyp zu ändern?
4) Wenn nein, gibt es eine möglichkeit, identische objekte ohne Extends mit den selben methoden und funktionen zu benutzen? (Angenommen, ein Type 'Motorad' wird nicht extendet, soll aber auf 'Auto' gecastet werden, um in weiteren Funktionen/Methoden genutzt zu werden. Motorad braucht aber genrell nur die hälfte der Felder und im prinzip viel weniger speicher. Wie löst man so etwas?)

----

Ich weiß, das können ziemlich dumme fragen sein. Allerdings spuckt mir papa google überwiegend Englische forenbeiträge aus, die ich nur teilweise nachvollziehen kann.
Ich appeliere hier an eure Freundlichkeit, kommentare ala 'Lern erstmal was über Types, dann komm wieder' könnt ihr euch sparen Smile -> Falls jemand das selbe problem wie ich hat und über google etwas finden möchte, so kriegt er hier hoffentlich antworten Wink

Gruß, Phillipk

Xeres

Moderator

BeitragMo, Okt 25, 2010 20:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Soweit ich weiß...
1) Ja - im Falle von Objekten sollte das Null-Objekt referenziert werden (sofern nicht anders initialisiert) und keinen zusätzlichen Speicher belegen.
2) Wie ist das gemeint? Stupide übernommen? Ich sag mal: ja.
3) Variablentyp ändern funktioniert nicht.
4) Um Methoden & Funktionen zu benutzen, müssen die Objekte mit Extend voneinander abstammen, das ist der Sinn der Sache. Sonst hat BMax keine Ahnung was zu tun ist, nehme ich mal an.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

mpmxyz

BeitragMo, Okt 25, 2010 20:24
Antworten mit Zitat
Benutzer-Profile anzeigen
1.) Alle Fields bekommen wie Variablen die üblichen Standardwerte oder das, dass du dort als Startwert angibst. Zahlen brauchen keinen extra Speicher, da die Werte direkt gespeichert werden. Angegebene Strings sind vorher schon vorhanden, wenn sie nicht durch beim Initialisieren genutzte String-Manipulationen erstellt werden. Neu erstellte Objekte werden neu erstellt...
(Alles geschieht vor dem Aufruf von "New".)
2.) Mir wird die Aussage nicht so ganz klar. Als Hinweis: Es handelt sich hier um ganz normale Objektorientierung. BlitzMax macht in diesem Punkt überhaupt nichts ungewöhnliches.
3.) Nein, diese Funktion würde einen nicht zu unterschätzenden Overhead produzieren und eine statische Typisierung verhindern. Sie würde auch zu Problemen mit
4.) Hier kann man eine abstrakte Klasse Fahrzeug nutzen, die alle gemeinsamen Eigenschaften und Methoden - auch abstrakte - vom Auto und vom Motorrad vereint. Die beiden Fahrzeugtypen sind dann Spezialisierungen, die nur die besonderen Eigenschaften und Methoden hinzufügen.
Notfalls kann man hier aber mit Reflection arbeiten, um Informationen von einem Objekt zu einem anderen zu übertragen.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer
 

PhillipK

BeitragMo, Okt 25, 2010 20:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist doch schonmal was Smile

Ich bin leider noch zu dämlich eine genaue Abgleichung zu erstellen, welche meiner Types jetzt wieviel speicher brauchen. Ich gehe einen umständlichen weg über den Taskmanager *g*
Liegt auch daran, das ich mich damit nie beschäftigt habe.

Zu 4) Das war mir wohl schon klar. Aber das ist auch nicht weiter wichtig, solange nicht für alles speicher reserviert wird. Nur zu schade, das ich den Variablen Typ nicht downgraden kann. Für manche sachen brauch ich einfach Int, bei vielen reicht aber schon short.

Zu 3): Ich weiß nicht genau, warum ich extends verwenden soll.
Für mich macht es nur sinn, wenn ich zb ein Type für items habe, welche von sachen wie Ausrüstung extendet wird.. Quasie ein oberobjekt was alle nötigen daten für ein Item enthält und eine Objekt erweiterung die die Ausrüstungsgebundenen Methoden und werte enhält. Unter strich schauts für mich so aus, das man weniger schreiben muss.
Genauer nachgedacht, könnte es noch ein wenig die größe von der Exe einschränken. Sehe ich das falsch oder ist es eine Stupide Progammierverinfachung, zu extenden?

---

Auf jedenfall danke für die Antwort Xeres - das hat meinem Post schon kräfitg den Wind aus den Segeln genommen und mir ein paar Stunden arbeit erspart Smile

Gruß, Phillipk Smile

Edit:
Huch das antworten geht ja schnell - ist man aus foren garnicht so gewohnt Smile

1-2-3 - kann man so abharken.

zu

Zitat:
4.) Hier kann man eine abstrakte Klasse Fahrzeug nutzen, die alle gemeinsamen Eigenschaften und Methoden - auch abstrakte - vom Auto und vom Motorrad vereint. Die beiden Fahrzeugtypen sind dann Spezialisierungen, die nur die besonderen Eigenschaften und Methoden hinzufügen.
Notfalls kann man hier aber mit Reflection arbeiten, um Informationen von einem Objekt zu einem anderen zu übertragen.


Eine anwendung für Abstract habe ich bis jetzt nie gefunden. Da werde ich mich wohl noch einlesen müssen. Habe es lediglich beim groben überschlagen von Quellcodes zur kenntniss genommen und aus früheren java versuchen noch grob im hinterkopf und auch dort nie eine wirkliche anwendung gefunden.

Danke auf jedenfall, das ihr euch trotz der Sinnlosigkeit meiner Fragen die Zeit nehmt, mir zu antworten.
Ich denke, wenn ich mich aktiv damit beschäfitgen würde, könnte ich mir die Antworten durch versuche und mehr google selbst zusammensuchen, allerdings beschäftigen mich meine Projektideen sosehr, das ich mir garnicht die Zeit dafür einräume *g*

FireballFlame

BeitragMo, Okt 25, 2010 20:38
Antworten mit Zitat
Benutzer-Profile anzeigen
1. Ja. Wenn du bei der Fielddeklaration oder in New() einen angegeben hast, sonst mit dem Standardwert (0/""/Null).
2. Extends ist, wie der Name sagt, dazu da, Klassen zu erweitern. Außerdem kannst du Objekte der erweiterten Klassen in die Basisklasse und wieder zurückcasten. Oder meintest du was anderes?
3. Nein.
4. Ein Motorrad ist kein Auto. Warum willst du die untereinander casten? Wenn sie gemeinsame Felder oder Methoden haben sollen, solltest du die vererben. Mach z.B. eine Fahrzeug-Klasse mit dem entsprechenden Inhalt und leite dann Motorrad sowie Auto von ihr ab.
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit

mpmxyz

BeitragMo, Okt 25, 2010 20:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Lass dir aber etwas sagen:
Das, was du da optimieren möchtest sind minimale Optimierungen.
Wenn du nicht gerade 1000000 Motorräder verwendest, wirst du nur ein paar Kibibyte an Speicherplatz sparen.
Extends ermöglicht die Nutzung der objektorientierten Programmierung.
Damit lassen sich einfach Sachen machen, die man sonst nicht ohne großen Aufwand machen lassen könnte.
So könntest du eine Liste mit allen Fahrzeugen haben und alle Fahrzeuge über einen "Draw"-Aufruf zeichnen lassen.
Das besondere: In der Klasse "Fahrzeug" wurde die Methode nur definiert, aber nicht mit Inhalten gefüllt.
Das wiederrum machen die erbenden Klassen.
Du kannst also Sachen in der Fahrzeugklasse verwenden, welche noch gar nicht existieren.
Du könntest, wenn du vorher entsprechend programmiert hast, auch später eine Flugzeugklasse einfügen, ohne dass du deine restlichen Codes anpassen musst.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer
 

PhillipK

BeitragMo, Okt 25, 2010 20:43
Antworten mit Zitat
Benutzer-Profile anzeigen
FireballFlame hat Folgendes geschrieben:
1. Ja. Wenn du bei der Fielddeklaration oder in New() einen angegeben hast, sonst mit dem Standardwert (0/""/Null).
2. Extends ist, wie der Name sagt, dazu da, Klassen zu erweitern. Außerdem kannst du Objekte der erweiterten Klassen in die Basisklasse und wieder zurückcasten. Oder meintest du was anderes?
3. Nein.
4. Ein Motorrad ist kein Auto. Warum willst du die untereinander casten? Wenn sie gemeinsame Felder oder Methoden haben sollen, solltest du die vererben. Mach z.B. eine Fahrzeug-Klasse mit dem entsprechenden Inhalt und leite dann Motorrad sowie Auto von ihr ab.


Noch mehr antworten! *ein wenig erschlagen ist*

Zu 1) so wie es klingt, werden Wert-variablen (int,short etc) mit 0 (bzw 0.0) intialisiert - belegt das nicht auch speicher? Das war nämlich meine befürchtung.

Zu 2) das ich Extends zurückcasten kann, ist sehr gut zu wissen. Allerdings ist es auch sinnlos, wenn ich das richtig mitgeschnitten habe, oder? Da ich - um beim oberen beispiel fahrzeug - auto - motorad zu bleiben (Farzeug ist an auto und motorad vererbt) zu bleiben, kann ich parameter, die ein 'Fahrzeug' wollen auch mit Auto bzw Motorad füttern, oder?

Zu 4) das wollen.. im Beispiele geben bin ich nicht so gescheit ^^ Türlich machts kein sinn, ein Auto als Motorad zu behandeln und umgekehrt ^^ Entschuldigt, das war eine leicht verplante idee von mir.

Gruß, Phillipk

Xeres

Moderator

BeitragMo, Okt 25, 2010 20:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Beispielcode!
BlitzMax: [AUSKLAPPEN]
SuperStrict

Type TFahrzeug
Field Reifen:Int

Global AlleFahrzeuge:TList = New TList

Method New()
TFahrzeug.AlleFahrzeuge.AddLast(Self)
End Method

Method GetReifen:Int()
Return Self.Reifen
End Method
End Type

Type TAuto Extends TFahrzeug

Method New()
Self.Reifen = 4
End Method
End Type

Type TMotorrad Extends TFahrzeug

Method New()
Self.Reifen = 2
End Method

End Type

Local Auto:TAuto = New TAuto
Local Rad:TMotorrad = New TMotorrad

For Local F:TFahrzeug = EachIn TFahrzeug.AlleFahrzeuge
Print(F.GetReifen())
Next
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

FireballFlame

BeitragMo, Okt 25, 2010 20:54
Antworten mit Zitat
Benutzer-Profile anzeigen
zu 1) Ja. Aber du hast doch nicht solche Riesenmengen an einzelnen Ints, dass das nicht zu verkraften wäre, oder? (Arrays z.B. sind ja wieder Objekte)
zu 2) Ganz und gar nicht sinnlos. Wie du schon sagtest, erlaubt es dir "parameter, die ein 'Fahrzeug' wollen auch mit Auto bzw Motorad [zu] füttern". Das heißt einer Variablen mit dem Typ Fahrzeug, ist es egal, ob du dann tatsächlich ein Auto oder ein Motorrad reinsteckst. Sieh dir dazu den Beispielcode von Xeres an! Würdest du Auto und Motorrad ohne Extends machen, bräuchtest du für GetReifen eine Fallunterscheidung und müsstest praktisch das gleiche doppelt schreiben. Selbiges würde gelten für "Method Drive()", "Field Driver:TPerson", oder was man da sonst noch alles hinzufügen könnte.

PhillipK hat Folgendes geschrieben:
Eine anwendung für Abstract habe ich bis jetzt nie gefunden.
Abstrakte Klassen benutzt man dann, wenn man Methoden in einer Klasse deklarieren, aber erst in einer abgeleiteten Klasse implementieren (also den Inhalt schreiben) will. Oder um einfach sicherzugehen, dass von einer Klasse kein Objekt erstellt wird, ohne sie abzuleiten. Ein Beispiel wäre die Klasse TPixmapLoader in BlitzMax: BMax kann von Haus aus BMP-, JPG und PNG-Bilder laden. Um weitere Dateiformate zu implementieren leitet man diese Klasse ab und füllt in der abgeleiteten Klasse die Methode LoadPixmap aus, die bereits in TPixmapLoader deklariert ist. Da die Methode ohne Inhalt aber keinen Sinn ergeben würde, ist die Methode (und TPixmapLoader selbst) abstrakt.
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit
 

PhillipK

BeitragMo, Okt 25, 2010 21:14
Antworten mit Zitat
Benutzer-Profile anzeigen
@Xeres:

Danke für das beispiel - über ein Eachin habe ich bis jetzt in diesem zusammenhang nie nachgedacht. Das eröffnet wieder eine vereinfachung für meine geplanten programmierungen. Smile

@FireballFlame:

Nach dem beispiel von Xeres ist mir auch eine gewisse wichtigkeit aufgefallen - kleinigkeiten zwar nur, aber diese können einiges vereinfachen und verschachtelungen verhindern.
Und auch so, nach ein bisschen durchdenken und verinnerlichen der Antworten, ergibt es mehr sinn als ich es bis jetzt verwendet hab.

Ausserdem danke für die erklärung einer Abstrakten klasse. Auch etwas, was ich bis jetzt nie benötigt hab.. Einfach weil ich das nicht brauchte. Smile

----

Ich glaube, ich weiß nun alles über Types, was mich noch intressiert hat. Falls ich beim stöbern und erarbeiten von meinen Programmstücken noch weitere fragen habe, werde ich mich hier nochmal melden. Ich danke euch für eure erklärungen Smile

Gruß, Phillip

----

Edit:

So. ich habe ein bisschen getestet. Mein rumüberlegen hat mich zu was gebracht Smile

Es gibt daten, die viel genauer gespeichert werden, als ich sie brauche (Stichwort: TSurface, minib3d).
Ich habe einfach mal getestet, ob alles noch funktioniert, wenn ick TSurface aus einem 'leeren' TSurface erstelle.
BlitzMax: [AUSKLAPPEN]
Type TSurfaceLEER
End Type

Type TSurface Extends TSurfaceLEER [...]

nun, ich denke, da ichs neu Compilen musste und alles noch genauso aussah wie vorher, das dies geklappt hat Smile
Meine frage geht nun ans casten:

Ich würde mich jetzt dransetzen und eine weitere Surface schreiben, wie ich sie bräuchte.
Meine idee ist, alle relevanten daten nicht als Floats zu speichern, sondern als Short (reicht mir) und sie in allen relevanten Methoden wieder zurückzurechnen (beispiel: wir (ich) brauche(n) nur eine genaugikeit von zirka einer nachkomma stelle, um die Vertixes zu speichern.)
Gäbe das irgendwelche probleme, wenn ich eine weitere surface erstelle, mit den Daten geändert, und diese als 'TSurface' behandeln kann?

Laut antwort über mir, kann ich beliebig zwischen extends und orignal herrumcasten. Ginge das auch, das ich von TSurfaceNew->TSurfaceLEER -> TSurface caste?

Dazu sei zu beachten, das ich die relevanten daten auch aktuell in den selben Field-namen speicher, allerdings diese erst einlese, sobald ich sie brauche. Ich würde also 1-2 neue methoden schreiben, die meine abgespeckte surface 'TSurface' tauglich machen.

Wenn dies nicht klappt, würde ich die Relevanten funktionen welche an OpenGL gehen, wahrscheinlich mit dem entsprechenden faktor und auf Float() gecastet verändern (für die abgespeckte surface) - würde das auch gehen? Very Happy

Das ganze gebrabbel müsst ihr nicht verstanden haben, sie war nur meine überlegung, WARUM ich das machen möchte. Meine frage ist simpel (erstmal), wie ich zwischen Extends und originalen rumcasten kann.
Dazu hier nochmal ein code:
BlitzMax: [AUSKLAPPEN]

Type LEER
End Type

Type NichtLeer Extends LEER
Field eintrag:Int = 10
End Type

Type Abgespeckt Extends LEER
Field eintrag2:Short = 10
End Type


Kann ich 'NichtLeer' als 'Abgespeckt' behandeln, und umgekehrt?
Kann ich von 'Abgespeckt' nach 'LEER' casten, und bei bedarf nach 'NichtLeer'? Smile

Ein simples ausprobier beispiel möchte ich mir jetzt nicht schreiben, da sich die frage auch auf das etwas komplexere TSurface bezieht..

Da fällt mir ein, das ich noch eine weitere frage hab:

BlitzMax: [AUSKLAPPEN]
Type Leer
End Type

Type NichtLeer Extends Leer
Field zahl:Int = 10
End Type

Function KannIchKlappen( param1:Leer ) [...]

End Function

Local var1:NichtLeer = New NichtLeer
KannIchKlappen(var1)


---> Kann ich, wo 'Leer' erwartet wird, ein extend von 'Leer' übergeben, ohne vorher 'Leer(Var1)' zu machen? Smile

Ps: Ich hoffe, meine frage-flut hat euch nicht erschlagen.. Und ich hoffe, ich habe mich einigermaßen verständlich ausgedrückt Sad Meine beispiele sollten eigentlich ziemlich knapp meine vorhaben (bzw überlegungen) ausdrücken :-/

Gruß, Phillipk Smile

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group