Seite 1 von 1
Map() an Procedure übergeben mit dem C-Backend
Verfasst: 29.01.2022 18:44
von ccode_new
Mit dem C-Backend kann man keine Map() - Strukturen an eine Procedure übergeben.
Diese angelegenten Map() sind danach nicht initalisiert.
Dies ist ein Bug der mich bisher am meisten nervt beim C-Backend.
Gibt es dafür eine gute Lösung.
Re: Map() an Procedure übergeben mit dem C-Backend
Verfasst: 29.01.2022 19:30
von mk-soft
Geht hier mit ASM und C-backend.
PB v6.00 Beta 3
Update 2 Example
Code: Alles auswählen
;-TOP
Structure udtMyData
iVal.i
sVal.s
EndStructure
Global NewMap mapMyData.udtMyData()
Procedure SetMap(Map mapData.udtMyData(), Key.s, Value.i, Text.s = "")
mapData(Key)\iVal = Value
mapData()\sVal = Text
EndProcedure
Procedure ListMap(Map mapData.udtMyData())
ForEach mapData()
Debug "Key(" + MapKey(mapData()) + ") iVal = " + mapData()\iVal + " sVal = " + mapData()\sVal
Next
EndProcedure
Procedure ShowMyData(*Data.udtMyData)
Debug "MyData iVal = " + *Data\iVal + " sVal = " + *Data\sVal
EndProcedure
ShowMyData(@mapMyData("Empty")) ; <- "@" nicht vergessen. Ist noch ein Bug in der Beta 2/3
SetMap(mapMyData(), "Key 1", 1, "Hello")
SetMap(mapMyData(), "Key 2", 2, "World")
mapMyData("Data 1")\iVal = 100
mapMyData("Data 2")\iVal = 200
ListMap(mapMyData())
ShowMyData(@mapMyData("Key 2")) ; <- "@" nicht vergessen. Ist noch ein Bug in der Beta 2/3
Re: Map() an Procedure übergeben mit dem C-Backend
Verfasst: 29.01.2022 19:52
von ccode_new
Hallo mk-soft!
Dein Beispiel funktioniert, aber versuche mal das hier:
Code: Alles auswählen
DeclareModule Test
Interface Test
ListMap(Map mapData.s())
EndInterface
Declare.i new()
EndDeclareModule
Module Test
Structure test_t
vTable.i
EndStructure
Procedure.i new()
Protected *this.test_t
*this = AllocateMemory(SizeOf(test_t))
If Not *this : ProcedureReturn #False : EndIf
*this\vTable = ?vTable_Test
ProcedureReturn *this
EndProcedure
Procedure Test_free(*this.test_t)
FreeMemory(*this)
EndProcedure
Procedure Test_ListMap(*this.test_t, Map mapData.s())
Debug "hier"
ForEach mapData()
Debug "Key(" + MapKey(mapData()) + ") iVal = " + mapData()
Next
EndProcedure
DataSection
vTable_Test:
Data.i @Test_ListMap()
EndDataSection
EndModule
UseModule Test
Global NewMap mapMyData.s()
test.Test = new()
mapMyData("Data 1") = "100"
mapMyData("Data 2") = "200"
test\ListMap(mapMyData())
UnuseModule Test
Re: Map() an Procedure übergeben mit dem C-Backend
Verfasst: 29.01.2022 20:04
von mk-soft
Welche Version verwendest du?
Läuft unter Window, macOS, Linux mit der Version Beta 2/3
Vielleicht falsche C-backend Version hinzugefügt

Re: Map() an Procedure übergeben mit dem C-Backend
Verfasst: 29.01.2022 20:19
von mk-soft
P.S.
Dein Aufbau für Objekte sieht schon sehr gut aus.
Ein paar Tipps noch
- Verwende AllocateStructure. Somit werden Variablen in der Struktur test_t gleich mit initialisiert und mit FreeStructure auch freigeben.
- Füge immer die Methode Release() oder Free() zum Interface hinzu.
- Verwende den prefix (i) für Interfaces. Macht Windows auch so. Siehe PB Tool Strukturverzeichnis.
Code: Alles auswählen
DeclareModule Test
Interface iTest
Release()
ListMap(Map mapData.s())
EndInterface
Declare.i new()
EndDeclareModule
Module Test
Structure test_t
vTable.i
EndStructure
Procedure.i new()
Protected *this.test_t
*this = AllocateStructure(test_t)
If Not *this
Debug "Out Of Menmory"
Else
*this\vTable = ?vTable_Test
EndIf
ProcedureReturn *this
EndProcedure
Procedure Release(*this.test_t)
FreeStructure(*this)
ProcedureReturn 0
EndProcedure
Procedure ListMap(*this.test_t, Map mapData.s())
Debug "hier"
ForEach mapData()
Debug "Key(" + MapKey(mapData()) + ") iVal = " + mapData()
Next
EndProcedure
DataSection
vTable_Test:
Data.i @Release()
Data.i @ListMap()
EndDataSection
EndModule
UseModule Test
Global NewMap mapMyData.s()
test.iTest = new()
mapMyData("Data 1") = "100"
mapMyData("Data 2") = "200"
test\ListMap(mapMyData())
test\Release()
UnuseModule Test
Re: Map() an Procedure übergeben mit dem C-Backend
Verfasst: 29.01.2022 20:25
von ccode_new
mk-soft hat geschrieben: 29.01.2022 20:19
Dein Aufbau für Objekte sieht schon sehr gut aus.

Na ja das ist so das minimale Class-Template.
Und mit PureBasic Beta3 funktioniert es auch.
Ich hatte noch Beta1 verwendet.
Danke für die ganzen Tipps.