Seite 1 von 2
NewList
Verfasst: 06.05.2013 18:37
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
Re: NewList
Verfasst: 06.05.2013 18:47
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
Re: NewList
Verfasst: 06.05.2013 19:03
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.
Re: NewList
Verfasst: 06.05.2013 19:10
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
Re: NewList
Verfasst: 06.05.2013 19:31
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
Re: NewList
Verfasst: 06.05.2013 19:37
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
Re: NewList
Verfasst: 06.05.2013 19:37
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
Re: NewList
Verfasst: 06.05.2013 19:49
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.
Re: NewList
Verfasst: 06.05.2013 20:00
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.
Re: NewList
Verfasst: 06.05.2013 22:47
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))