Seltsames Verhalten bei strukturiertem Array

Anfängerfragen zum Programmieren mit PureBasic.
Salafat
Beiträge: 30
Registriert: 05.01.2012 07:40
Computerausstattung: AMD FX-8350 Eight-Core-Prozessor 4,00 GHz
8 GB RAM
Windows 7 64-Bit
Wohnort: Berlin

Seltsames Verhalten bei strukturiertem Array

Beitrag 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
PureBasic v5.11 x64
Windows 7 64-Bit
AMD FX-8350 Eight-Core Processor 4 GHz, 8 GB Arbeitsspeicher
Benutzeravatar
alter Mann
Beiträge: 201
Registriert: 29.08.2008 09:13
Wohnort: hinterm Mond

Re: Seltsames Verhalten bei strukturiertem Array

Beitrag 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
Win11 64Bit / PB 6.0
Benutzeravatar
Bisonte
Beiträge: 2430
Registriert: 01.04.2007 20:18

Re: Seltsames Verhalten bei strukturiertem Array

Beitrag 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)
PureBasic 6.10 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Antworten