Pointer auf Type
Übersicht BlitzMax, BlitzMax NG Allgemein
wunderkindBetreff: Pointer auf Type |
Mi, März 30, 2005 16:30 Antworten mit Zitat |
|
---|---|---|
Moin,
eine Funktion erhält per Parameter den Pointer zu einem Type. Quizfrage: wie gelange ich direkt wieder an die Eigentschaften etc. des Types? |
||
Jolinah |
Mi, März 30, 2005 16:39 Antworten mit Zitat |
|
---|---|---|
Pointer kannst du zum Beispiel mit [0] dereferenzieren. Also so wie ein Array nutzen und halt aufs erste Element zugreifen:
Code: [AUSKLAPPEN] Type a Field wert End Type Local mya:a = New a mya.wert = 20 Local b:a Ptr = Varptr mya Print b[0].wert mya = Null b = Null FlushMem End |
||
- Zuletzt bearbeitet von Jolinah am Mi, März 30, 2005 16:45, insgesamt einmal bearbeitet
Suco-XBetreff: ...... |
Mi, März 30, 2005 16:40 Antworten mit Zitat |
|
---|---|---|
Bis jetzt habe ich da nur eine Möglichkeit gefunden :
Code: [AUSKLAPPEN] type TTest field Wert end type local Test1:Ttest = new TTest Test1.Wert = 4000 Test(Test1) function Test(TypePtr:byte ptr) local TempTest:TTest = new TTest memcopy TempTest,TypePtr,sizeof(TempTest) print TempTest.Wert TempTest = null FlushMem() end function Mfg Suco |
||
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB |
wunderkind |
Mi, März 30, 2005 16:45 Antworten mit Zitat |
|
---|---|---|
Jolinah's Ansatz bemeckert der Compiler nicht, aber ich erhalte noch keine vernünftigen Werte. Liegt sicher an meinem Code.
Suco-X: Naja, das ist ja nicht gerade der direkte Weg . Und irgendwie hebt er den Vorteil der Pointer ja wieder auf. |
||
Jolinah |
Mi, März 30, 2005 16:46 Antworten mit Zitat |
|
---|---|---|
Ich hatte ungültige namen verwendet, war halt aus dem Kopf raus. Jetzt sollte es stimmen (siehe oben) | ||
wunderkind |
Mi, März 30, 2005 16:51 Antworten mit Zitat |
|
---|---|---|
Dein Beispiel hatte ich so nicht verwendet, sondern meinen Code angepasst . Dennoch erhalte ich Werte die auf wirre Pointer schließen lassen: viel zu große oder negative Werte. | ||
Suco-XBetreff: ..... |
Mi, März 30, 2005 16:52 Antworten mit Zitat |
|
---|---|---|
Du könntest noch den genauen Sinn deines vorhabens erläutern. Type Instanzen sind doch schon Pointer..Versteh nicht ganz was du genau erreichen willst.
Mfg Suco |
||
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB |
wunderkind |
Mi, März 30, 2005 16:59 Antworten mit Zitat |
|
---|---|---|
Etwas in der folgenden Art möchte ich haben, wobei es um Ressourcenteilung geht. Merkwürdig, wenn ich den Code so abstrahiere und alleinstelle, dann funktioniert's.
Code: [AUSKLAPPEN] Type ttype1
Field xvar : Int Field yvar : Int Field ptype2 : ttype2 Ptr Method assign_type(_type : ttype2) ptype2 = Varptr _type End Method End Type Type ttype2 Field value : Int Method set_prop(_value : Int) value = _val End Method End Type Local t1 : ttype1 = New ttype1 Local t2 : ttype2 = New ttype2 t2.value = 42 t1.assign_type(t2) Print(t1.ptype2[0].value) End |
||
- Zuletzt bearbeitet von wunderkind am Mi, März 30, 2005 16:59, insgesamt einmal bearbeitet
DivineDominion |
Mi, März 30, 2005 16:59 Antworten mit Zitat |
|
---|---|---|
Negative WErte sind okay, schließlich ist das erste der 32 bits das vorzeichenbit. Hast dann noch 32 für die Zahl. Kannst dir aj ausrechnen wie groß eine 32bit Zahl sein kann. | ||
christian.tietze@gmail.com - https://christiantietze.de
macOS |
Dreamora |
Mi, März 30, 2005 17:01 Antworten mit Zitat |
|
---|---|---|
Wenn du effektiv mit pointer willst, dann musst du wohl Banks daraus machen, denn Types gehören zum "Type safe" Part von BM und können nicht über unsafe wege ausgehebelt werden.
Wenn du den genauen Type von dem was du verpointerst weisst, dann sollte jedoch auch ein Varptr - Type() Weg im Bereich des möglichen sein. Was einfach nicht möglich ist, ist zb auf diesem weg etwas wie "Unique" zu faken und dergleichen, da es wie erwähnt der typesafeness widerspricht. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
wunderkind |
Mi, März 30, 2005 17:22 Antworten mit Zitat |
|
---|---|---|
Alles klar, funzt. Bei Method assign_type() fehlte var. Muss also heißen: Method assign_type(_type : ttype2 var) Dann klappst auch an anderer Stelle mit dem dereferenzieren. | ||
DivineDominion |
Do, März 31, 2005 0:39 Antworten mit Zitat |
|
---|---|---|
Dann sinds doch keine Pointer sondern sicherere Referenzen
Hättest mein Tutorial mal gelesen |
||
christian.tietze@gmail.com - https://christiantietze.de
macOS |
wunderkind |
Do, März 31, 2005 9:04 Antworten mit Zitat |
|
---|---|---|
Ich fummel mich lieber so durch . Nah, ich habe einen Blick in das Tut geworfen...einen ganz kurzen .
Wenn ich übrigens während eines Zyklus' auf FlushMem() verzichte, dann schnellt der Speicherverbrauch ziemlich fix nach oben. |
||
Dreamora |
Do, März 31, 2005 14:00 Antworten mit Zitat |
|
---|---|---|
Das ist klar, weil der Speicher nicht mehr freigegeben wird, der zusätzlich aufgebaut wird durch die übergabe von types an funktionen / methoden etc.
Das setzen von =null etc gibt ja den speicher nicht frei |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
wunderkind |
Do, März 31, 2005 20:02 Antworten mit Zitat |
|
---|---|---|
Na, dass das Null-setzen den Speicher nicht freigibt, dachte ich mir schon. Nur an welcher Stelle bleibt eigentlich Speicher reserviert? Das würde ja bedeuten, dass man immer besser fährt, wenn man regelmäßig FlushMem() aufruft. | ||
Dreamora |
Fr, Apr 01, 2005 1:35 Antworten mit Zitat |
|
---|---|---|
alles was du allozierst bleibt reserviert bis flushmem aufgerufen wird.
Das gilt auch für lokale Variablen etc. Am einfachsten packst du es in die Hauptschleife direkt nach Flip etc (wenn du es in eine Funktion packst bringt es nichts, da es nur untergeordnete Scopes aufräumt, aber nicht vorhergehende), dann hast du auch keine Memory Leaks |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
wunderkind |
Fr, Apr 01, 2005 8:23 Antworten mit Zitat |
|
---|---|---|
Auch lokale Reservierungen werden nicht wieder abgeräumt . Hossa! Warum nicht?
Ich verwende einen globalen Ticker ...wer den Code schon gesehen hat, weiß was ich meine. Der kümmert sich darum, dass FlushMem() immer nach einem bestimmten Zeitinterval aufgerufen wird. |
||
Dreamora |
Fr, Apr 01, 2005 8:53 Antworten mit Zitat |
|
---|---|---|
Weil garnix aufgeräumt wird ohne Flushmem. Flushmem weisst den Garbage Collector an die unreferenzierten Objekte freizugeben.
Dazu zählen natürlich auch Locals (nicht nur in functions, in Strict ist jegliche schleife / struktur ein eigener scope mit eigenen global / local ), da diese nach der Funktion ja nur ungültig werden, aber nicht aufhören zu existieren |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
Jolinah |
Fr, Apr 01, 2005 9:02 Antworten mit Zitat |
|
---|---|---|
Wenn ich das richtig verstanden habe sollte man dann ganz am Ende des Programms auch nochmal Flushmem aufrufen. Aber ich nehm jetzt mal an beim Beenden wird das automatisch gemacht.
Code: [AUSKLAPPEN] Strict Graphics(400,400,0) Local bla:TImage = LoadImage("bla.png") Repeat Cls Flip Flushmem Until Keyhit(KEY_ESCAPE) End In dem Fall würde sich ja Flushmem nur auf die Repeat-Schleife und alle untergeordneten Scopes beziehen. Aber ich hab zu Beginn ein Bild geladen welches nicht in der Schleife ist. Wird das am Ende entfernt oder muss ich vor dem End noch bla auf Null setzen und ein Flushmem aufrufen? |
||
Dreamora |
Fr, Apr 01, 2005 9:21 Antworten mit Zitat |
|
---|---|---|
Ich nehme eigentlich schwer an, dass der GarbageCollector bei End alles frei gibt, wäre sonst eine fragliche Einrichtung, da er sich ja bei End selbst aufräumt
Da ich XP hab kann ich das nicht sagen, da XP automatisch wegräumt. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
Übersicht BlitzMax, BlitzMax NG Allgemein
Powered by phpBB © 2001 - 2006, phpBB Group