Pointer to List()! Wie?

Für allgemeine Fragen zur Programmierung mit PureBasic.
SMaag
Beiträge: 150
Registriert: 08.05.2022 12:58

Pointer to List()! Wie?

Beitrag von SMaag »

Wie bekommt man Pointer auf Listen ähnlich der Übergabe eine Liste an eine Procedure

so ist es kein Problem

Code: Alles auswählen

Procedure Test(List MyList.i())
  AddElement MyList()
EndProcedure
Jetzt das ganze, wenn die Liste innerhalb der Procedure mit Pointer sein soll

Code: Alles auswählen

Global NewList List1.i(), NewList List2.i()

Procedure TestListPointer()
   Protected *ptrList
   ; Protected List *ptrList

  *ptrList = @List1()
  AddElement (*ptrList)

  *ptrList =@List2()
  AddElement (*ptrList)

EndProcedure
ich bekomm das nicht gebacken!
geht das überhaupt irgendwie?
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Pointer to List()! Wie?

Beitrag von STARGÅTE »

So direkt leider nicht.
Da musst du dir eine Helfer-Struktur machen und dann den Pointer der Struktur-Daten übergeben:

Code: Alles auswählen

Structure MyList
	List List0.i()
EndStructure

Global MyList1.MyList, MyList2.MyList

Procedure TestListPointer()
	
	Protected *ptrList.MyList
	
	*ptrList = @MyList1
	AddElement (*ptrList\List0())
	
	*ptrList = @MyList2
	AddElement (*ptrList\List0())
	
EndProcedure

TestListPointer()

ShowVariableViewer()
CallDebugger
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benubi
Beiträge: 186
Registriert: 22.10.2004 17:51
Wohnort: Berlin, Wedding

Re: Pointer to List()! Wie?

Beitrag von Benubi »

Das geht nur mit in Strukturen eingebauten PB Linked Lists (Arrays, Maps...). Diese Daten-Typen bzw. Struktur-Elemente für Listen, Array und Maps sind auch größer als nur 1 Zeiger/Integer. Es wird also eine Struktur implementiert und nicht ein Zeiger auf eine Struktur (k.A. ob es deswegen nur indirekt geht).

Code: Alles auswählen

Structure MyMap
   Map env.s()
EndStructure

Procedure$ ReplaceEnvVariables(String$, *Env.MyMap)

  Debug "MyMap pointer"
  Debug *Env
  Debug @*Env\env() ; <- !?

EndProcedure

Define bla.MyMap

Debug ReplaceEnvVariables("Hello", bla)
SMaag
Beiträge: 150
Registriert: 08.05.2022 12:58

Danke

Beitrag von SMaag »

So hab ich das jetzt im Prinzip gelöst, das listen von Listen!

Code: Alles auswählen

Structure TListWraper
  List MyList.i()
EndStructure

NewList Lister.TListWraper()

For I=1 To 5
  AddElement(Lister())
  For N = 1 To 20
    AddElement(Lister()\MyList())
    Lister()\MyList() = I
  Next 
Next 

ResetList(Lister())
ForEach Lister()
  Debug "Lister " 
  ResetList(Lister()\MyList())
  
  ForEach Lister()\MyList()
    Debug Lister()\MyList()
  Next
Next

Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Pointer to List()! Wie?

Beitrag von NicTheQuick »

Du brauchst kein ResetList() vor einem ForEach. :-)
Bild
Antworten