Überlauf bei Floats und Fehler bei SortStructuredList

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Justy
Beiträge: 131
Registriert: 10.09.2004 13:31
Wohnort: Feldbach / Steiermark / Österreich
Kontaktdaten:

Überlauf bei Floats und Fehler bei SortStructuredList

Beitrag von Justy »

Hallo!
Ich habe ein seltsames Problem mit folgendem Code:

Das Programm soll alle Ordner eines bestimmten Verzeichnisses auslesen und nach Größe sortieren (da Windows das nicht von alleine schafft >_< ).

Das funktioniert eigentlich -erstaunlich- gut, aber bei einigen anscheinend willkürlichen Einträgen wird statt der Größe nur der negative Maximalwert einer Long-Variable (-2147483648) angezeigt, was zusätzlich seltsam anmutet, da ich für die Größe Floats verwende.


Als zweites Problem erzeugt das SortStructuredList vor der Ausgabe einen Invalid Memory Access und ich komme nicht dahinter warum!!


Der Code ist sehr einfach gestrickt und eigentlich nur schnell zusammengebastelt (sollte ja nicht öffentlich werden <)):

Code: Alles auswählen

;Directory Size

pfad$=PathRequester("Wählen Sie einen Ordner:","")
If pfad$="" : End: EndIf

Enumeration
  #Window
  #List
  #Label
  #Pfad
EndEnumeration

Structure direct
  name.s
  size.f 
EndStructure

NewList dir.direct()
Global dir.l

Procedure.s groesse(gross.f); - Wandelt eine Größe von KBytes in einen String mit KB, MB und GB um (Rundung auf 2 Stellen)
  If gross<0
    ende$=Str(gross*1024)+" Byte"
  ElseIf gross<1024
    ende$=StrF(gross,2)+" KB"
  ElseIf gross<1048576
    ende$=StrF(gross/1024,2)+" MB"
  Else
    ende$=StrF(gross/1048576,2)+" GB"
  EndIf
  ProcedureReturn ende$
EndProcedure

Procedure.f DirectorySize(pfad$); - Gibt die Größe eines Verzeichnisses mit Unterverzeichnissen in KB zurück
  dir+1
  pdir=dir
  ExamineDirectory(dir,pfad$,"")
  Repeat
    If size.f=-2147483648
      CallDebugger                        ;<<=== Stoppt bei dem Fehler
    EndIf
    Select NextDirectoryEntry()
      Case 1
        size.f+DirectoryEntrySize()/1024
      Case 2 
        If DirectoryEntryName()<>"." And DirectoryEntryName()<>".."
          path$=pfad$+DirectoryEntryName()+"\"
          size.f+DirectorySize(path$)
          ;Debug path$
          UseDirectory(pdir)
        EndIf 
      Case 0
        ProcedureReturn size
    EndSelect
  ForEver 
EndProcedure

; Analyse des angegebenen Verzeichnisses
ExamineDirectory(dir,pfad$,"")
Repeat
  Select NextDirectoryEntry()
    Case 2
      AddElement(dir())
      dir()\name=DirectoryEntryName()
      dir()\size=DirectorySize(pfad$+dir()\name+"\")
      UseDirectory(0)
    Case 0
      quit=1
  EndSelect
Until quit=1

; Fenster öffnen für Ausgabe
If OpenWindow(#Window, 355, 82, 600, 780,  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar , "DirectorySize")
  If CreateGadgetList(WindowID())
    
    ;-
    ListIconGadget(#List, 0, 25, 600, 755, "Name", 450, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection)
    AddGadgetColumn(#List, 1, "Größe", 146)
    TextGadget(#Label, 10, 5, 30, 15, "Pfad:")
    StringGadget(#Pfad, 40, 5, 560, 19, "", #PB_String_ReadOnly | #PB_String_BorderLess)
    
  EndIf
EndIf

; Ausgabe
SortStructuredList(dir(),1,OffsetOf(direct\size),#PB_Sort_Float) ;<==== INVALID MEMORY ACCESS
ResetList(dir())
For i = 0 To CountList(dir())-1
  NextElement(dir())
  AddGadgetItem(#List,i,dir()\name)
  SetGadgetItemText(#List,i,groesse(dir()\size),1)
Next
SetGadgetText(#Pfad,pfad$)

; Eventschleife :D
Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
End
Ich hoffe ihr wisst Rat!
lg. Justy
Am Anfang erschuf der Mensch Gott.
Friedrich Nietzsche
Benutzeravatar
Macros
Beiträge: 1361
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Beitrag von Macros »

wenn du die Size statt in eine Float
in eine Long-Variable speicherst
läuft dein Programm einwandfrei,
mit Float auch bei mir die Errors :?
Benutzeravatar
Justy
Beiträge: 131
Registriert: 10.09.2004 13:31
Wohnort: Feldbach / Steiermark / Österreich
Kontaktdaten:

Beitrag von Justy »

Stimmt, ja, dann funktioniert sogar SortStructuredList (mit Float-Einstellung!!:?)

Für mich ist die Ungenauigkeit zwar zu verschmerzen, da ich eh nur die großen Ordner wissen möchte, aber vielleicht möchte ja trotzdem noch jemand die Hintergründe dieses seltsamen Verhaltens erforschen? :lol:

mfg. Justy
Am Anfang erschuf der Mensch Gott.
Friedrich Nietzsche
Benutzeravatar
Macros
Beiträge: 1361
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Beitrag von Macros »

Wenns läuft, ist´s gut.
Außerdem ist es überhaupt nicht ungenau,
im Vergleich zum Explorer und für deine Anwendung.
Benutzeravatar
Justy
Beiträge: 131
Registriert: 10.09.2004 13:31
Wohnort: Feldbach / Steiermark / Österreich
Kontaktdaten:

Beitrag von Justy »

Mit ungenau mein ich dass kleinere Ordner nicht mehr berücksichtigt werden (>1kb). Is aber für den Anwendungszweck wirklich egal :lol:


BTW: Weiß jemand wie man die Symbole im Explorer selbst anders anordnet? :mrgreen:

mfg. Justy
Am Anfang erschuf der Mensch Gott.
Friedrich Nietzsche
Antworten