Seite 1 von 1

Seltsames Verhalten bei strukturiertem Array

Verfasst: 11.05.2017 07:36
von Salafat
Hallo,

folgende Ausgangslage:

Ich habe ein Programmfenster mit einem Listview-Gadget, das 44 Einträge enthält, die aus einer Textdatei eingelesen wurden. Jeder einzelne Eintrag hat das Format "nn,n × nn,n × nn,n", wo n für eine Ziffer steht und die Fließpunktkomponente häufig auch wegfällt, also z.B. 64 × 40 × 50,5 (es handelt sich um Länge-, Breite- u. Höhe-Maßangaben in Zentimeter).

Ich habe nun zu dieser Liste eine Sortierfunktion geschrieben, die die einzelnen Einträge nach Volumen (L × B × H) sortieren soll. Der Case zur Button-Eventbehandlung, der diese Sortierfunktion auslöst, sieht folgendermaßen aus (#Lf_Pm ist #Gadget des ListView-Gadgets):

Code: Alles auswählen

   ...
      Case #Sf_S ; Schaltfläche "Sortieren"
        Structure Paket
          L.s ; Länge
          B.s ; Breite
          H.s ; Höhe
          V.d ; Volumen
        EndStructure
        Define AE=CountGadgetItems(#Lf_Pm)-1, Ix ; AE = Anzahl der Einträge, Ix = Index
        Define.s Km, Tr=" × " ; Km = Komplettmaße, Tr = Trennstring (für StringField)
        Dim P.Paket(AE)
        For Ix=0 To AE
          Km=GetGadgetItemText(#Lf_Pm, Ix)
          P(Ix)\L = StringField(Km, 1, Tr)
          P(Ix)\B = StringField(Km, 2, Tr)
          P(Ix)\H = StringField(Km, 3, Tr)
          P(Ix)\V = ValD(P(Ix)\L) * ValD(P(Ix)\B) * ValD(P(Ix)\H)
        Next
        SortStructuredArray(P(), #PB_Sort_Descending, OffsetOf(Paket\V), #PB_Double)
        ClearGadgetItems(#Lf_Pm)
        For Ix=0 To AE
          AddGadgetItem(#Lf_Pm, -1, P(Ix)\L + Tr + P(Ix)\B + Tr + P(Ix)\H)
        Next
    EndSelect
Zuerst wird also mittels Structure ein neuer benutzerdefinierter Datentyp "Paket" kreiert und dann ein Array dieses Datentyps erstellt, das alle Daten der ListView-Liste aufnimmt. Mittels StringField werden die Listeneinträge in ihre L/B/H-Teile zerlegt und diese dann in der For-Next-Schleife den \L-, \B- und \H-Feldern von P() zugewiesen. Mittels

Code: Alles auswählen

P(Ix)\V = ValD(P(Ix)\L) * ValD(P(Ix)\B) * ValD(P(Ix)\H)
wird dann das Volumen berechnet -- das letzte Feld von P(), nach dem nach Durchlaufen der Schleife mittels SortStructuredArray das strukturierte Array dann sortiert wird. Dann wird die ListView-Liste gelöscht und die sortierten Werte aus P() in die Liste zurückgeschrieben.

Der Kode tut an sich, was er soll, mit einer kleinen, für mich unerklärlichen Ausnahme: Bei der allerersten V-Variable des strukturieren Feldes, P(0)\V -- und nur bei dieser --, funktioniert die Volumenberechnung nicht. Den Variablen P(0)\L, P(0)\B und P(0)\H werden die korrekten Werte aus der ListView-Liste zugewiesen, aber P(0)\V bleibt bei 0.0. Wie gesagt: Ab der zweiten V-Variable P(1)\V funktioniert die Berechnung tadellos.

Ich würde gern an dieser Stelle ein Snapshot der Variablenliste posten, die die Felder von P(0), P(1) und P(2) zeigt, aber leider kann man keine Dateien hochladen, sondern nur URLs für Bilder angeben.

Hat jemand eine Idee, wieso P(0)\V nicht berechnet wird?

Vielen Dank

Re: Seltsames Verhalten bei strukturiertem Array

Verfasst: 11.05.2017 10:04
von alter Mann
füge doch einfach mal die ersten paar Zeilen Deiner Textdatei hier ein. So viel wird das ja nicht sein. Außerdem kannst Du Deine Werte mal kontrollieren, ob sie richtig übernommen werden.

Code: Alles auswählen

Debug ValD(P(Ix)\L)
Debug ValD(P(Ix)\B)
Debug ValD(P(Ix)\H)
So aus dem Bauch würde ich sagen, dass einer der Werte 0 wird :D

Re: Seltsames Verhalten bei strukturiertem Array

Verfasst: 11.05.2017 10:18
von Bisonte
Und um die Ergebnisse nicht zu ruinieren, solltest du aus jedem Komma " , " einen Punkt " . " machen (per ReplaceString).
Weil ValD() schneidet nach dem Komma alles weitere ab. ( 50,3 wird 50.0) Bei einem Punkt (was die
normale Schreibweise in PB ist) wird alles richtig berechnet. (50.3 bleibt 50.3)