Überlauf bei Floats und Fehler bei SortStructuredList
Verfasst: 08.01.2006 18:34
				
				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
):
Ich hoffe ihr wisst Rat!
lg. Justy
			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
Endlg. Justy