NewList

Anfängerfragen zum Programmieren mit PureBasic.
Martin66119
Beiträge: 282
Registriert: 03.01.2005 11:36

NewList

Beitrag von Martin66119 »

Hallo,

im Netz habe ich folgendes gefunden.

Code: Alles auswählen

Define Datei1.String
Define *pDatei1.String
*pDatei1 = @Datei1
*pDatei1\s = File2()
Debug *pDatei1\s
Damit kann ich per Pointer auf das erste Element einer Liste zugreifen. Wenn ich nun perointer auf den Inhalt des zweiten Listenelements zugreifen möchte, wie geht das?

Kann mir da jemand helfen.

Danke bereits hier

Codetags hinzu
-- Andesdaf
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: NewList

Beitrag von ts-soft »

Irgendwie sehe ich keine Liste in Deinem Code. Vielleicht erstmal dieses Beispiel:

Code: Alles auswählen

NewList Datei.s()

*Datei1 = AddElement(Datei())
Datei() = "1Datei"
*Datei2 = AddElement(Datei())
Datei() = "2Datei"

Debug PeekS(PeekI(*Datei1))
Debug PeekS(PeekI(*Datei2))
AddElement gibt den Pointer zurück. Strings erfordern eine kleine Sonderbehandlung.

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Martin66119
Beiträge: 282
Registriert: 03.01.2005 11:36

Re: NewList

Beitrag von Martin66119 »

Das stimmt. Der Teil ist wohl zu kurz.

Code: Alles auswählen

NewList File1.s()

For i = 1 To 4
  AddElement(File1())
  File1() = "Zeile_"+Str(i)
Next i

FirstElement(File1())
Define Datei1.String
Define *pDatei1.String
*pDatei1 = @Datei1
*pDatei1\s = File1()
For i = 1 To 4
  Debug *pDatei1\s
  ;?????????
Next
Die Frage ist: Wie muss ich in der Schleife den Pointer ändern, damit ich die einzelnen Listenelemente anzeigen kann.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: NewList

Beitrag von ts-soft »

Ich verstehe den Sinn Deines vorgehens nicht. Es wird kein Pointer gebraucht. Dieser wird nur gebraucht,
wenn man das aktuelle Element ändert und später wieder an dieselbe Postion möchte, dafür gibts aber
inzwischen auch Pop/PushListPos.
Die normale Iteration sieht so aus:

Code: Alles auswählen

NewList File1.s()

For i = 1 To 4
  AddElement(File1())
  File1() = "Zeile_"+Str(i)
Next i

ForEach File1()
  Debug File1()
Next
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Martin66119
Beiträge: 282
Registriert: 03.01.2005 11:36

Re: NewList

Beitrag von Martin66119 »

Hallo und Danke schon einmal.

Code: Alles auswählen

NewList File1.s()

For i = 1 To 4
  AddElement(File1())
  File1() = "Zeile_"+Str(i)
Next i

FirstElement(File1())
Define Datei1.String
Define *pDatei1.String
*pDatei1 = @Datei1
*pDatei1\s = File1()
For i = 1 To 4
  Debug *pDatei1\s
  ;?????????
Next
Ich würde gerne in einer Schleife das Listenelement 1 mit dem Listenelement 2 vergleichen. Ich denke, dass der Vergleich über Pointer etwas schneller geht wie mit Variabeln zu arbeiteb

if *pDatei1\s = ??????;
endif
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: NewList

Beitrag von ts-soft »

Eine Liste verwendet man, wenn man eine dynamische Anzahl elemente hat. Du hantierst immer mit 1 - 4?
Wenn die Anzahl feststeht, wäre ein Array sinnvoller und würde das mit dem Pointer vielleicht mehr Sinn
machen. So sehe ich weder den Sinn noch den Vorteil.
Für mich sieht es so aus, als wenn Du alles nur verkomplizierst ohne jegliche Vorteile.

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: NewList

Beitrag von NicTheQuick »

Du willst jedes Listenelement mit jedem anderen vergleichen?
Das geht so:

Code: Alles auswählen

NewList File1.s()

For i = 1 To 4
	AddElement(File1())
	File1() = "Zeile_" + Str(i)
Next i

Define *File.String

ForEach File1()
	*File = @File1()
	PushListPosition(File1())
	While NextElement(File1())
		Debug "Vergleiche " + *File\s + " mit " + File1()
	Wend
	PopListPosition(File1())
Next 
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: NewList

Beitrag von ts-soft »

Ich möchte aber trotzdem bezweifeln, das durch die Pointer irgendetwas schneller wird:

Code: Alles auswählen

NewList File1.s()

For i = 1 To 4
  AddElement(File1())
  File1() = "Zeile_" + Str(i)
Next i

Define File.s

ForEach File1()
  File = File1()
  PushListPosition(File1())
  While NextElement(File1())
    Debug "Vergleiche " + File + " mit " + File1()
  Wend
  PopListPosition(File1())
Next 
Sollte auch nicht langsamer sein.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: NewList

Beitrag von NicTheQuick »

Klar, so ist's eigentlich auch für den Laien verständlicher. Ich hab mich von seiner Pointerei hinreißen lassen. Aber theoretisch ist die Pointerlösung natürlich schneller, weil dann keinerlei Strings kopiert werden müssen. Wenn die Strings jetzt ewig lang wären, dann würde sich das bemerkbar machen, wobei die quadratische Laufzeit durch die Schachtelung ja trotzdem überwiegt. ;)
Das Schnellste ist normalerweise die Liste oder das Array zu sortieren und dann durch iterieren und schauen, ob zwei gleiche Strings aufeinander folgen.
Martin66119
Beiträge: 282
Registriert: 03.01.2005 11:36

Re: NewList

Beitrag von Martin66119 »

Hallo nocheinmal

Ich suche die schnellste Lösung um z.B, folgendes zu realisieren. Und das ganze möchte ich auch noch verstehen. Das wird wohl das schwierigste sein.

Code: Alles auswählen

NewList File1.s()

For i = 0 To 1000000
  AddElement(File1())
  File1() = "Dies ist ein Teststring_" + Str(i)
  ;Debug File1()
Next

:AddElement(File1())
File1() = "Dies ist ein Teststring _" + Str(1000000)

SortList(File1(),#PB_Sort_Ascending)
Anzahl = ListSize(File1()) -1
StartTime = ElapsedMilliseconds()
FirstElement(File1())
;---------------------------------------------------------
For i = 0 To Anzahl-1
  SelectElement(File1(),i)
  Vergleich1$ = File1()
  NextElement(File1())
  Vergleich2$ = File1()
  ;MessageRequester(Vergleich1$, Vergleich2$)
  If Vergleich1$ = Vergleich2$
    j = j + 1
  EndIf
Next
;---------------------------------------------------------
Time =ElapsedMilliseconds() - StartTime
 
MessageRequester("Auswertezeit", Str(Time))
MessageRequester("", "AnzahlDoppelt = "+ Str(j))
Antworten