Map() an Procedure übergeben mit dem C-Backend

Für allgemeine Fragen zur Programmierung mit PureBasic.
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Map() an Procedure übergeben mit dem C-Backend

Beitrag 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.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
mk-soft
Beiträge: 3871
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Map() an Procedure übergeben mit dem C-Backend

Beitrag 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

Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Map() an Procedure übergeben mit dem C-Backend

Beitrag 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
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
mk-soft
Beiträge: 3871
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Map() an Procedure übergeben mit dem C-Backend

Beitrag 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 ;)
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
mk-soft
Beiträge: 3871
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Map() an Procedure übergeben mit dem C-Backend

Beitrag 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
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
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Map() an Procedure übergeben mit dem C-Backend

Beitrag 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.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Antworten