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.
Map() an Procedure übergeben mit dem C-Backend
Map() an Procedure übergeben mit dem C-Backend
Betriebssysteme: div. Windows, Linux, Unix - Systeme
no Keyboard, press any key
no mouse, you need a cat
no Keyboard, press any key
no mouse, you need a cat
Re: Map() an Procedure übergeben mit dem C-Backend
Geht hier mit ASM und C-backend.
PB v6.00 Beta 3
Update 2 Example
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
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Re: Map() an Procedure übergeben mit dem C-Backend
Hallo mk-soft!
Dein Beispiel funktioniert, aber versuche mal das hier:
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
Betriebssysteme: div. Windows, Linux, Unix - Systeme
no Keyboard, press any key
no mouse, you need a cat
no Keyboard, press any key
no mouse, you need a cat
Re: Map() an Procedure übergeben mit dem C-Backend
Welche Version verwendest du?
Läuft unter Window, macOS, Linux mit der Version Beta 2/3
Vielleicht falsche C-backend Version hinzugefügt
Läuft unter Window, macOS, Linux mit der Version Beta 2/3
Vielleicht falsche C-backend Version hinzugefügt
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Re: Map() an Procedure übergeben mit dem C-Backend
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.
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
Zuletzt geändert von mk-soft am 29.01.2022 20:29, insgesamt 2-mal geändert.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Re: Map() an Procedure übergeben mit dem C-Backend
Und mit PureBasic Beta3 funktioniert es auch.
Ich hatte noch Beta1 verwendet.
Danke für die ganzen Tipps.
Betriebssysteme: div. Windows, Linux, Unix - Systeme
no Keyboard, press any key
no mouse, you need a cat
no Keyboard, press any key
no mouse, you need a cat