Grundlegende Type-informationen
Übersicht

PhillipKBetreff: Grundlegende Type-informationen |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Grüße forum ![]() 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 ![]() 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 ![]() 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]
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 ![]() ![]() Gruß, Phillipk |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Das ist doch schonmal was ![]() 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 ![]() Gruß, Phillipk ![]() Edit: Huch das antworten geht ja schnell - ist man aus foren garnicht so gewohnt ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Beispielcode!
BlitzMax: [AUSKLAPPEN] SuperStrict |
||
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
FireballFlame |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@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. ![]() @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. ![]() ---- 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 ![]() Gruß, Phillip ---- Edit: So. ich habe ein bisschen getestet. Mein rumüberlegen hat mich zu was gebracht ![]() 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 nun, ich denke, da ichs neu Compilen musste und alles noch genauso aussah wie vorher, das dies geklappt hat ![]() 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? ![]() 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]
Kann ich 'NichtLeer' als 'Abgespeckt' behandeln, und umgekehrt? Kann ich von 'Abgespeckt' nach 'LEER' casten, und bei bedarf nach 'NichtLeer'? ![]() 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 ---> Kann ich, wo 'Leer' erwartet wird, ein extend von 'Leer' übergeben, ohne vorher 'Leer(Var1)' zu machen? ![]() Ps: Ich hoffe, meine frage-flut hat euch nicht erschlagen.. Und ich hoffe, ich habe mich einigermaßen verständlich ausgedrückt ![]() Gruß, Phillipk ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group