Seite 1 von 1

Überlauf bei Floats und Fehler bei SortStructuredList

Verfasst: 08.01.2006 18:34
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

Verfasst: 08.01.2006 18:44
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 :?

Verfasst: 08.01.2006 18:51
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

Verfasst: 08.01.2006 18:53
von Macros
Wenns läuft, ist´s gut.
Außerdem ist es überhaupt nicht ungenau,
im Vergleich zum Explorer und für deine Anwendung.

Verfasst: 08.01.2006 19:09
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