Pointer casten und retrieven/erhalten.

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

Xaymar

ehemals "Cgamer"

Betreff: Pointer casten und retrieven/erhalten.

BeitragMo, Feb 21, 2011 17:09
Antworten mit Zitat
Benutzer-Profile anzeigen
ich weiß das das direkte casten dahin nicht geht, was mich nun etwas zurückwirft. Ich versuche derzeit ein Dateiformat zu basteln was ganz viele Daten benannt beinhaltet.
Problem sind dabei Byte Short Int Float und Double, da ich diese nicht nach Object casten kann. Types Banks und Strings gehen.

BlitzMax: [AUSKLAPPEN]
Const DC_TYPE_CNTR:Byte = %00000000	'0
Const DC_TYPE_BANK:Byte = %00000001 '1
Const DC_TYPE_BYTE:Byte = %00000010 '2
Const DC_TYPE_SHRT:Byte = %00000011 '3
Const DC_TYPE_INTE:Byte = %00000100 '4
Const DC_TYPE_FLOT:Byte = %00000101 '5
Const DC_TYPE_DBLE:Byte = %00000110 '6
Const DC_TYPE_STNG:Byte = %00000111 '7
Const DC_TYPE_CMMT:Byte = %00001000 '8
Const DC_FRMT_CNTR_OPEN:Byte = %11111110
Const DC_FRMT_CNTR_CLSE:Byte = %11111111

?Debug
Global _DebugDepth:String = ""
?
Type DCContainer
'Members
Field m_Parent:DCContainer
Field m_Name:String
Field m_Type:Byte
Field m_Data:Object

'Con/Decon
Method New()
End Method
Method Destroy()
If m_Type = DC_TYPE_CNTR
For Local dcData:DCContainer = EachIn TList(m_Data)
dcData.Destroy()
Next
TList(m_Data).clear()
End If
m_Name = Null
m_Type = Null
m_Data = Null
End Method

'Save/Load
Method Save:Byte(File:String)
If m_Type = DC_TYPE_CNTR And m_Parent = Null
Local fStream:TStream = WriteFile(File)
If fStream
?Debug
_DebugDepth = ""
DebugLog _DebugDepth + "Saving to File '" + File + "'..."
_DebugDepth = " "
?
Self.Write(fStream)
CloseFile(fStream)
?Debug
_DebugDepth = ""
DebugLog _DebugDepth + "Done!"
?
Return True
Else
Return False
EndIf
Else
Return False
End If
End Method

'Private Write
Method Write(fStream:TStream)
Select m_Type
Case DC_TYPE_CNTR
?Debug
DebugLog _DebugDepth + "Writing Container '" + m_Name + "'..."
_DebugDepth = _DebugDepth + " "
?
fStream.WriteByte(DC_TYPE_CNTR)
fStream.WriteString(m_Name)
fStream.WriteByte(DC_FRMT_CNTR_OPEN)
For Local dcData:DCContainer = EachIn TList(m_Data)
dcData.Write(fStream)
Next
fStream.WriteByte(DC_FRMT_CNTR_CLSE)

?Debug
_DebugDepth = _DebugDepth[0.._DebugDepth.Length - 2]
DebugLog _DebugDepth + "Wrote Container '" + m_Name + "'."
?
Case DC_TYPE_BANK
?Debug
DebugLog _DebugDepth + "Writing Bank '" + m_Name + "' with " + TBank(m_Data).Size() + "b Size..."
?
fStream.WriteByte(DC_TYPE_BANK)
fStream.WriteString(m_Name)
fStream.WriteInt(TBank(m_Data).Size())
fStream.Write(TBank(m_Data).Buf(), TBank(m_Data).Size())
Case DC_TYPE_STNG
?Debug
DebugLog _DebugDepth + "Writing String '" + m_Name + "': " + String(m_Data) + "..."
fStream.WriteByte(DC_TYPE_BYTE)
fStream.WriteString(m_Name)
fStream.WriteString(String(m_Data))
?
End Select
End Method
End Type

Function DC_CreateContainer:DCContainer(Parent:DCContainer, Name:String)
If Parent = Null Or Parent.m_Type = DC_TYPE_CNTR
Local DC:DCContainer = New DCContainer
DC.m_Name = Name
DC.m_Type = DC_TYPE_CNTR
DC.m_Data = New TList
DC.m_Parent = Parent
If DC.m_Parent <> Null
TList(DC.m_Parent.m_Data).AddLast(DC)
EndIf
Return DC
EndIf
Return Null
End Function
Function DC_CreateBank:DCContainer(Parent:DCContainer, Name:String, Bank:TBank)
If Parent <> Null Or Parent.m_Type = DC_TYPE_CNTR
Local DC:DCContainer = New DCContainer
DC.m_Name = Name
DC.m_Type = DC_TYPE_BANK
DC.m_Data = Bank
DC.m_Parent = Parent
If DC.m_Parent <> Null
TList(DC.m_Parent.m_Data).AddLast(DC)
EndIf
Return DC
End If
Return Null
End Function
Function DC_CreateString:DCContainer(Parent:DCContainer, Name:String, Data:String)
If Parent <> Null Or Parent.m_Type = DC_TYPE_CNTR
Local DC:DCContainer = New DCContainer
DC.m_Name = Name
DC.m_Type = DC_TYPE_STNG
DC.m_Data = Data
DC.m_Parent = Parent
If DC.m_Parent <> Null
TList(DC.m_Parent.m_Data).AddLast(DC)
EndIf
Return DC
End If
Return Null
End Function


Ginge dieser Aufbau wenn ich anstatt :Object :Byte Ptr nehme? oder :Int Ptr? Ginge der Aufbau überhaupt in einer Form?
Warbseite
  • Zuletzt bearbeitet von Xaymar am Di, Feb 22, 2011 16:30, insgesamt einmal bearbeitet

BladeRunner

Moderator

BeitragMo, Feb 21, 2011 19:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Da wird dir nichts anderes übrigbleiben als diese Typen zu wrappen, sie also zu Objekten zu machen.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

d-bug

BeitragMo, Feb 21, 2011 20:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Oder du castest sie in ein String, denn das geht auch wunderbar als Object durch.
So mach ich es zumindest immer, wenn ich solcherlei Daten in eine Liste oder Map speichern möchte.

Xaymar

ehemals "Cgamer"

BeitragMo, Feb 21, 2011 21:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Variablen Pointer würden also nicht gehen(Varptr)?

edit: bzw wie castet man einen ptr wieder zurück?
Warbseite

FireballFlame

BeitragDi, Feb 22, 2011 3:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, Pointer lassen sich nicht nach Object casten.
Pointer zurück nach Wert geht mit "pointervariable[0]".
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

Xaymar

ehemals "Cgamer"

BeitragDi, Feb 22, 2011 11:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich meinte damit nicht Pointer nach object casten sondern eher sowas:
Code: [AUSKLAPPEN]
local a:tlist = createlist()
local b:byte ptr = varptr(a)
local c:Tlist = Tlist(a[0])
Warbseite

FireballFlame

BeitragMi, Feb 23, 2011 2:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich nehm an, du meinstest am Ende "TList(b[0])". In diesem Fall: nein, das geht so nicht. Ich weiß aber nicht, ob es überhaupt irgendwie möglich ist, einen Pointer wieder in ein Object umzuwandeln, ich hab es nie gebraucht.
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

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group