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.
:mrgreen: 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.