forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   PureBasic (http://forum.boolean.name/forumdisplay.php?f=90)
-   -   Помогите, вылетает Invalid Memory Acces (http://forum.boolean.name/showthread.php?t=6560)

MadMedic 03.10.2008 19:07

Помогите, вылетает Invalid Memory Acces
 
Помогите, пожалуйста, кто нибудь. При компилляции вылетает на втором (i=1) цикле на строке *L_Serial=AllocateMemory(4). Только не надо говорить о неразумном расходовании памяти, в программе и не такое может встретиться. Пробовал компилить на PB 4.01 и 4.20. В чем тут ошибка не пойму
Код:

;OpenLibrary(0, "kernel32.DLL")


For i=0 To 25

Debug i

  *S_Drive=AllocateMemory(256)
  PokeS(*S_Drive,Chr(65+i)+":\")
 
  *S_Volume=AllocateMemory(256)
  PokeS(*S_Volume,Space(256))
 
  *L_Volume=AllocateMemory(4)
  PokeL(*L_Volume,256)
 
  *L_Serial=AllocateMemory(4)
  PokeL(*L_Serial,0)
 
  *L_Max=AllocateMemory(4)
  PokeL(*L_Max,0)
 
  *L_Flags=AllocateMemory(4)
  PokeL(*L_Flags,0)
 
  *S_FileSys=AllocateMemory(256)
 
  *L_FileSys=AllocateMemory(4)
  PokeL(*L_FileSys,256)

  ;res=CallFunction(0, "GetVolumeInformationA",*S_Drive,*S_Volume,*L_Volume,*L_Serial,*L_Max,*L_Flags,*S_FileSys,*L_FileSys)

  If res=1
    Debug  "path "+PeekS(*S_Drive)
    Debug  "volume name "+ PeekS(*S_Volume)
    Debug  "Serial "+Str(PeekL(*L_Serial))
    Debug  "Flags "+Str(PeekL(*L_Flags))
    Debug  "File system "+PeekS(*S_FileSys)
  EndIf

 *S_DriveName=AllocateMemory(256)
 PokeS(*S_DriveName,Chr(65+i)+":\")

 *L_Free=AllocateMemory(8)
 PokeQ(*L_Free,0)

 *L_Total=AllocateMemory(8)
 PokeQ(*L_Total,0)

 *L_Avial=AllocateMemory(8)
 PokeQ(*L_Avial,0)

; res=CallFunction(0, "GetDiskFreeSpaceExA",*S_DriveName,*L_Free,*L_Total,*L_Avial)

 If res=1
  Debug  "path "+PeekS(*S_Drive)
  Debug  "Free "+Str(PeekQ(*L_Free)/1048576)
  Debug  "Total "+Str(PeekQ(*L_Total)/1048576)
  Debug  "Aviable "+Str(PeekQ(*L_Avial)/1048576)
 EndIf


Next


Venom 05.10.2008 20:34

Ответ: Помогите, вылетает Invalid Memory Acces
 
Жжошь :) Выделять по 4 байта памяти на переменные это сильно, да :)
Код:

Define.s root_name, volume_name, system_name
Define.l volume_serial, max_length, system_flags
Define.q free_bytes_avail, total_bytes, total_free_bytes

volume_name = Space(#MAX_PATH)
system_name = Space(#MAX_PATH)
drives_avail = GetLogicalDrives_()
For i = 0 To 31
    If ((drives_avail >> i) & 1)
        root_name = Chr(i + 65) + ":\"
        If (GetVolumeInformation_(root_name, @volume_name, #MAX_PATH, @volume_serial, @max_length, @system_flags, @system_name, #MAX_PATH))
            Debug "Root name " + root_name
            Debug "Volume name " + volume_name
            Debug "Serial " + Hex(volume_serial)
            Debug "Flags " + Str(system_flags)
            Debug "File system " + system_name
        EndIf
        If (GetDiskFreeSpaceEx_(root_name, @free_bytes_avail, @total_bytes, @total_free_bytes))
            Debug "Free bytes available " + Str(free_bytes_avail >> 20)
            Debug "Total bytes " + Str(total_bytes >> 20)
            Debug "Total free bytes " + Str(total_free_bytes >> 20)
        EndIf
    EndIf
Next
End


Venom 05.10.2008 20:47

Ответ: Помогите, вылетает Invalid Memory Acces
 
Еще кстати можно использовать GetLogicalDriveStrings_ для того чтобы не перебирать все возможные диски:
Код:

Define.s drives, root_name, volume_name, system_name
Define.l length, volume_serial, max_length, system_flags
Define.q free_bytes_avail, total_bytes, total_free_bytes

volume_name = Space(#MAX_PATH)
system_name = Space(#MAX_PATH)
drives = Space(#MAX_PATH)
length = GetLogicalDriveStrings_(#MAX_PATH, @drives) - 1
For i = 0 To length Step 4
    Debug "Root name " + PeekS(@drives + i)
    If (GetVolumeInformation_(@drives + i, @volume_name, #MAX_PATH, @volume_serial, @max_length, @system_flags, @system_name, #MAX_PATH))
        Debug "Volume name " + volume_name
        Debug "Serial " + Hex(volume_serial)
        Debug "Flags " + Str(system_flags)
        Debug "File system " + system_name
    Else
        Debug "Unavaliable"
    EndIf
    If (GetDiskFreeSpaceEx_(root_name, @free_bytes_avail, @total_bytes, @total_free_bytes))
        Debug "Free bytes available " + Str(free_bytes_avail >> 20)
        Debug "Total bytes " + Str(total_bytes >> 20)
        Debug "Total free bytes " + Str(total_free_bytes >> 20)
    EndIf
    Debug "------------------"
Next
End


MadMedic 08.10.2008 07:02

Re: Помогите, вылетает Invalid Memory Acces
 
Спасибо!


Часовой пояс GMT +4, время: 03:03.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot