Noch eine Sache: SortArray()

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
sharkpeter
Beiträge: 474
Registriert: 29.08.2004 16:18
Wohnort: Dresden
Kontaktdaten:

Noch eine Sache: SortArray()

Beitrag 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 :freak:!
PB3.94 bis 6.xx / (Win98/98SE/ME/XPProSP3/WINVista-X32)/WIN7HP-X64/WIN8PRO-X32/WIN10-64

Nichts wissen macht nichts, sich dumm stellen aber schon.
Benutzeravatar
redacid
Beiträge: 581
Registriert: 29.08.2004 17:06

Beitrag 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.
Benutzeravatar
sharkpeter
Beiträge: 474
Registriert: 29.08.2004 16:18
Wohnort: Dresden
Kontaktdaten:

Beitrag 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.
PB3.94 bis 6.xx / (Win98/98SE/ME/XPProSP3/WINVista-X32)/WIN7HP-X64/WIN8PRO-X32/WIN10-64

Nichts wissen macht nichts, sich dumm stellen aber schon.
Icke
Beiträge: 143
Registriert: 08.09.2004 13:19

Beitrag 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?
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

@Icke
So wie es hiermit:

Code: Alles auswählen

SortArray(ArrayName(), Optionen [, Start, Ende])
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

Code: Alles auswählen

aditem=CountGadgetItems(#ListView_3)
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
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
sharkpeter
Beiträge: 474
Registriert: 29.08.2004 16:18
Wohnort: Dresden
Kontaktdaten:

Beitrag 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.
PB3.94 bis 6.xx / (Win98/98SE/ME/XPProSP3/WINVista-X32)/WIN7HP-X64/WIN8PRO-X32/WIN10-64

Nichts wissen macht nichts, sich dumm stellen aber schon.
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag 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
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
sharkpeter
Beiträge: 474
Registriert: 29.08.2004 16:18
Wohnort: Dresden
Kontaktdaten:

Beitrag 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! :D
PB3.94 bis 6.xx / (Win98/98SE/ME/XPProSP3/WINVista-X32)/WIN7HP-X64/WIN8PRO-X32/WIN10-64

Nichts wissen macht nichts, sich dumm stellen aber schon.
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag 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
Bild
Win11 Pro 64-Bit, PB_6.11b1
Antworten