Pointer auf Type

Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

wunderkind

Betreff: Pointer auf Type

BeitragMi, März 30, 2005 16:30
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, März 30, 2005 16:39
Antworten mit Zitat
Benutzer-Profile anzeigen
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-X

Betreff: ......

BeitragMi, März 30, 2005 16:40
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, März 30, 2005 16:45
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink. Und irgendwie hebt er den Vorteil der Pointer ja wieder auf.

Jolinah

BeitragMi, März 30, 2005 16:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hatte ungültige namen verwendet, war halt aus dem Kopf raus. Jetzt sollte es stimmen (siehe oben)

wunderkind

BeitragMi, März 30, 2005 16:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Dein Beispiel hatte ich so nicht verwendet, sondern meinen Code angepasst Wink. Dennoch erhalte ich Werte die auf wirre Pointer schließen lassen: viel zu große oder negative Werte.

Suco-X

Betreff: .....

BeitragMi, März 30, 2005 16:52
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Wink
Mfg Suco
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB

wunderkind

BeitragMi, März 30, 2005 16:59
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, März 30, 2005 16:59
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, März 30, 2005 17:01
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, März 30, 2005 17:22
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, März 31, 2005 0:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann sinds doch keine Pointer sondern sicherere Referenzen Smile
Hättest mein Tutorial mal gelesen Very Happy
christian.tietze@gmail.com - https://christiantietze.de
macOS

wunderkind

BeitragDo, März 31, 2005 9:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich fummel mich lieber so durch Wink. Nah, ich habe einen Blick in das Tut geworfen...einen ganz kurzen Wink.

Wenn ich übrigens während eines Zyklus' auf FlushMem() verzichte, dann schnellt der Speicherverbrauch ziemlich fix nach oben.
 

Dreamora

BeitragDo, März 31, 2005 14:00
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

wunderkind

BeitragDo, März 31, 2005 20:02
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Apr 01, 2005 1:35
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

wunderkind

BeitragFr, Apr 01, 2005 8:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Auch lokale Reservierungen werden nicht wieder abgeräumt Shocked. Hossa! Warum nicht?

Ich verwende einen globalen Ticker Wink...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

BeitragFr, Apr 01, 2005 8:53
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Jolinah

BeitragFr, Apr 01, 2005 9:02
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Apr 01, 2005 9:21
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink

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.

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group