DF

Torak 02.02.04 14:14

DiskFree v. 1.0 Pieni UNIX komennon klooni WIN32.

 Tekstiversio  Arvo: -1 (1 ääntä)  Äänestä: +  -
/* DiskFree v. 1.0 Pieni UNIX komennon klooni WIN32. Tämä ohjelma toimii
   32 bittisillä windowseilla konsolissa. Ohjelma näyttää kaikkien
   kiintolevyosoittein ja RAM-levyjen vapaan tilan ja koon.

   Ohjelman tarkoituksena on esitellä kuinka GetLogicalDrives()
   funktiota käytetään.

   Käännettyä Microsoft Visual C++ v. 7 ja MinGW:llä.

   Tulostus:
   C: 11186 MB / 19955 MB
   D: 2505 MB / 57308 MB
*/


#include <windows.h>
#include <stdio.h>
#include <tchar.h>

int _tmain(void)
{
        DWORD drives;
        TCHAR szRoot[] = _T("X:\\");
        TCHAR x;
        UINT type;
        unsigned __int64 i64FreeBytesToCaller;
        unsigned __int64 i64TotalBytes;
        unsigned __int64 i64FreeBytes;

        drives = GetLogicalDrives();
        if(drives == 0) return 1;

        for(x=0;  drives != 0 ; x++)
        {
                if(drives & 1)
                {
                        szRoot[0] = 'A' + x;

                        type = GetDriveType(szRoot);
                        if(type == DRIVE_FIXED || type ==DRIVE_RAMDISK)
                        {
                                if(!GetDiskFreeSpaceEx (szRoot,
                                        (PULARGE_INTEGER) &i64FreeBytesToCaller,
                                       (PULARGE_INTEGER) &i64TotalBytes,
                                        (PULARGE_INTEGER) &i64FreeBytes))
                                        return 2;

                                if(_tprintf(_T("%c: %I64u MB / %I64u MB\n"), szRoot[0],
                                        i64FreeBytesToCaller / (1024*1024),
                                        i64TotalBytes / (1024*1024)) < 3)
                                        return 3;
                        }
                }
                drives = drives >> 1;
        }

        return 0;
}
 

remix 18:22 2.2.04 
for -silmukan voi muuttaa muotoon
for(x=0; drives != 0; x++)
{
...
}
Poistaa muutaman turhan loopin
remix 18:26 2.2.04 
Mb != MB
Ork 12:16 3.2.04 
<pilkunnussinta>
drives = drives >> 1; voi suoraan laittaa drives >>=1;
(vrt. esim. a = a + 1; == a+=1; )
</pilkunnussinta>
ihan ok koodi.
Torak 16:21 3.2.04 
Noniin ja megabitit ja megatavut on korjattu. Samalla muutin funktiot tchar.h yhteensopiviksi.

No joo tuonn bittisiirron olisi voinut kirjoittaa lyhyemmin mutta meikäläisen mielestä se on selkeempi tuollain.

Tuota for() silmukkaa ei oikeastaan voi poistaa koska
asema tunnukset eivät välttämättä jätku seuraavasta kirjaimesta.
remix 16:56 3.2.04 
Ei sitä for -silmukkaa ole tarkoitus poistaa. drives != 0 lopettaa silmukan pyörittämisen, kun sitä on siitä on shiftattu kaikki ykköset pois, eli ei ole enää asemia jäljellä. Eihän tuolla nyt suurta merkitystä ole, mutta niin olen sen itse joskus tehnyt. Ihan näppärä demohan tämä on.
Torak 04:50 4.2.04 
Meikäläinen taas kirjoittelee ja ajattelee toista. Eli !=0 on huono, koska se lopettaa ensimmäiseen käyttämättömään asematunnukseen. Ei ole olemassa mitään takeita siitä että välissä olisi n käyttämätöntä tunnusta ja sitten tulisi taas jotain.

Tietysti tuota voisi optimoida niin että siirretään bittejä pari kertaa ennen silmukkaa niin sulmukan kierrosten määrää saadaan pienennettyä. Mutta se on turhaa pelleilyä.
remix 12:34 4.2.04 
rohkenen olla eri mieltä, drives != 0 ei lopeta ensimmäiseen käyttämättömään tunnukseen, vaan kun ei ole enää asemia jäljellä. Käyttämättömien tunnuksien ei pitäisi tuottaa ongelmia, koska drives != 0 ei vertaa alinta bittiä, vaan koko muuttujan arvoa.
Torak 15:09 4.2.04 
Aivan oikein kun kuumessa keskiyöllä kirjoittelee niin ajatuksen juoksi on epäselvä.