Seite 1 von 1
Noch eine Sache: SortArray()
Verfasst: 11.09.2004 22:32
von sharkpeter
Ist jemandem bekannt, daß die oder ob die Sortierungen von Strings in der einen oder anderen Richtung nicht funktionieren?
Ich habe das Problem, daß ich ein leeres oder mit Sch.. gefülltes Array zurück bekomme, wenn ich die Option 2 (String aufwärts) benutze. Für Option 3 (String abwärts) ist alles OK. Es spielt auch keine Rolle, ob die Strings aus einer Datei kommen oder anderswo her, auch nicht, ob ein oder mehrere Worte enthalten sind oder nur Groß-/Kleinbuchstaben.
Habe dazu auch im "alten" Forum mal gesucht und auch von @Falko - Danke - einen Tip erhalten, aber grundlegend zur implementierten Funktion nichts gefunden.
Nun kann man ein String-Array ja auch nachträglich drehen. Ist dies aber Sinn der Sache?
Merkwürdigerweise ist das Beispiel auch mit Option 3

!
Verfasst: 12.09.2004 16:45
von redacid
Vielleicht hilft dir dies ja - Zitat aus der Anleitung:
Ist ein Array nicht vollständig gefüllt, dann werden 'Null'-Elemente an den Anfang des Arrays (bei aufsteigender Sortier-Richtung) bzw. an das Ende des Arrays (bei absteigender Sortier-Richtung) sortiert.
Außerdem werden z.B. Leerzeichen am Anfang einer Zeile auch mitsortiert, ein " Zacharias" steht somit im sortierten Array vor einem "Andreas". Somit solltest du die Strings vorher mit Trim() behandeln. Bei mir funktioniert es dann einwandfrei.
Verfasst: 12.09.2004 17:19
von sharkpeter
Code: Alles auswählen
Procedure WBSafeData()
MessageID=MessageRequester("SICHERHEITSABFRAGE","geänderte Daten sichern?",4)
gaditem=CountGadgetItems(#ListView_3)
If MessageID=6
If DeleteFile(_selpfad): EndIf
For a=0 To gaditem-1
_sort(a)=GetGadgetItemText(#ListView_3,a,0)
Next a
SortArray(_sort(),3)
If OpenFile(1,_selpfad)
a=gaditem-1
Repeat
WriteStringN(_sort(a))
a=a-1
Until a<=-1
CloseFile(1)
EndIf
EndIf
MessageID=0
LoadData()
EndProcedure
@redacid
hätte gleich mal den Code-Teil mitposten können.
Also zum Verständnis:
irgendwann nehme ich Änderungen, Ergänzungen in dem ListView vor. Diese sollen vor der Sicherung logischer Weise in die richtige Reihenfolge.
Mit der Option 3 funktioniert es ja auch, muß dann das Ganze eben noch drehen. Kein Beinbruch, nur eben umständlich. Hier fehlt jetzt einiges, der Pfad, die Dimensionierung ist nur ein Abriß aus meinem Programm.
Am Ende wird dann mit der Procedure LoadData() das ListView neu beschrieben. Diese fehlt jetzt hier natülich auch, ist aber unwesentlich.
Verfasst: 12.09.2004 19:11
von Icke
Btw: Wie kann man z.B. eigentlich bei einem 2 dimensionalen Array nach 2tem Array sortieren? Geht das mit Boardmitteln oder muss man basteln?
Verfasst: 14.09.2004 17:23
von Falko
@Icke
So wie es hiermit:
aussieht, ist es wohl nicht so möglich. Du müßtest quasi ein eindimensionales Hilfsarray erzeugen und darin die Werte aus dem 2tem Array reinkopieren. Danach das SortArray() ausführen und dann wieder ins Origninal zurück kopieren. Anders wüßte ich es leider auch nicht, da dieser Befehl wohl das gesamte Array sortiert.
@sharkpeter
Nur mal so ein Gedanke. Habs noch nicht ausprobieren können, aber in der Procedure könntest du
doch das _sortArray() mit Hilfe von
neu dimensionieren. Dann dürfte es aber nicht Global sein bzw. müßte
es vielleicht auf _sortArray1() in der Proc.. abgeändert werden.
MfG Falko
Verfasst: 18.09.2004 13:23
von sharkpeter
@Falko
weiß jetzt nicht, wie du das mit dem neu dimensionieren meinst. Meinst du das ListView oder das Feld _sort(a). Das Feld nehme ich nur als Hilfsvariable und ist durch Dim _sort(xx) ja immer Global.
Verfasst: 18.09.2004 20:28
von Falko
@sharkpeter
Ich meinte die Hilfsvariable _sort(). Wenn Du diese in der Procedure nochmal nach Anzahl der Einträge im Listview() neu dimensionierst ?
Kann sein das ich das falsch verstanden habe. Aber ich vermute mal, das
aus den vorherigen Sortierungen noch Strings im Array erhalten bleiben, die nach dem Abwärtssortieren nicht auffallen. Sobald man entgegengesetzt sortieren läßt, werden diese sichtbar, weil diese nicht vorher gelöscht (initialisiert) wurden.
Falls ich den obigen Code falsch interpretiert haben sollte, korrigiere mich bitte.
Gruß, Falko
Verfasst: 19.09.2004 15:52
von sharkpeter
@Falko
wenn es dich nicht gäbe, säße ich manchmal ganz schön in der Sch...
Was ich nicht verstehe, wieso geht es ohne neue Dimensionierung in Richtung Z nach A
Danke vielmals!

Verfasst: 19.09.2004 16:23
von Falko
Meinst du diese Dim _sort.s(entry) , die ich dir in der Procedure
hinzugefügt habe?
Ohne diese gehts bei mir auch nicht. Am Anfang des Programms wurden
511 Arrays dimensioniert. Aus dem Listview sind aber nur z.B 15 Zeilen, die du im Array einliest. Beim SortArray(_sort()) wird das ganze Array mit
den 511 Feldern sortiert. In der Datei werden durch die For Next Schleife nur die 15 Daten und der Rest als Leere 0-Arrays zurückgeschrieben. Deshalb hab ich das so in der
Procedure gemacht, nur soviel Arrays zu benutzen, wie du auch sortieren willst. Beim GFA-Basic gibt es einen REDIM-Befehl, aber unter Purebasic
lassen sich die Anzahl der Arrays auch mit DIM erneut ändern und sind auch in der Procedure global.
MfG Falko