CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Wyliczanie dysków lokalnych

Wyliczanie dysków lokalnych

dział ogólny

Wyliczanie dysków lokalnych

Nowy postprzez Pitek » piątek, 23 grudnia 2011, 14:46

Witam mam taki kod i nie wiem czemu nic on nie zwraca...
KOD cpp:     UKRYJ  
//--------------------------------
void __fastcall EnumDrivers(TStrings *EnumList)
{
wchar_t DriveName[4];
for(char Drive = 'A'; Drive <= 'Z'; Drive++)
{
DriveName[0] = Drive;
if(GetDriveType(DriveName) == DRIVE_FIXED)
{
DriveName[1] = '\0';
EnumList->Add((String)Drive + ":\\");
DriveName[1] = ':';
}
}
}
//--------------------------------

Chodzi mi tylko o lokalne dyski twarde.
Wywołuje go tak :
KOD cpp:     UKRYJ  
EnumDrivers(ListBox4->Items);
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    Windows XPFirefox

Re: Wyliczanie dysków lokalnych

Nowy postprzez Cyfrowy Baron » piątek, 23 grudnia 2011, 15:12

Już chyba kiedyś zwróciłem tobie uwagę, że albo używasz typu wchar_t, albo char, a Ty wciąż łączysz, że sobą te dwa typy zmiennych. Nie z tego powodu jednak kod nie działa, lecz dlatego, że nie zainicjowałeś zmiennej DriveName żadną wartością. Powinno być:

KOD cpp:     UKRYJ  
void __fastcall EnumDrivers(TStrings *EnumList)
{
 wchar_t DriveName[4] = L"A:\\";
 for(char Drive = 'A'; Drive <= 'Z'; Drive++)
 {
  DriveName[0] = Drive;

  if(GetDriveType( DriveName) == DRIVE_FIXED)
  {
        DriveName[1] = '\0';
        EnumList->Add((String)Drive + ":\\");
        DriveName[1] = ':';
  }
 }
}


Jak już wspomniałem powinieneś się zdecydować na jeden typ zmiennych, gdyż w przypadku tego kodu nie ma żadnego uzasadnienia, dla stosowania dwóch różnych typów:

wchar_t:
KOD cpp:     UKRYJ  
void __fastcall EnumDrivers(TStrings *EnumList)
{
 wchar_t DriveName[4] = L"A:\\";
 for(wchar_t Drive = 'A'; Drive <= 'Z'; Drive++)
 {
  DriveName[0] = Drive;

  if(GetDriveType( DriveName ) == DRIVE_FIXED)
  {
        DriveName[1] = '\0';
        EnumList->Add((String)Drive + ":\\");
        DriveName[1] = ':';
  }
 }
}


char:
KOD cpp:     UKRYJ  
void __fastcall EnumDrivers(TStrings *EnumList)
{
 char DriveName[4] = "A:\\";
 for(char Drive = 'A'; Drive <= 'Z'; Drive++)
 {
  DriveName[0] = Drive;

  if(GetDriveTypeA( DriveName ) == DRIVE_FIXED)
  {
        DriveName[1] = '\0';
        EnumList->Add((String)Drive + ":\\");
        DriveName[1] = ':';
  }
 }
}


Zwróć uwagę, że stosując zmienną char, używam funkcji GetDriveTypeA.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
Pitek
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Wyliczanie dysków lokalnych

Nowy postprzez polymorphism » piątek, 23 grudnia 2011, 15:52

Czy mi się wydaje, czy ten fragment kodu jest bez sensu:
KOD cpp:     UKRYJ  
DriveName[1] = '\0';
EnumList->Add((String)Drive + ":\\");
DriveName[1] = ':';

Przecież DriveName już zawiera ścieżkę w formacie "<litera dysku>:\\".
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Wyliczanie dysków lokalnych

Nowy postprzez Cyfrowy Baron » piątek, 23 grudnia 2011, 16:59

Dobrze się Tobie wydaje, ten kod to przerobiona porada:

KOD cpp:     UKRYJ  
void __fastcall EnumDrivers(TStrings *EnumList)
{
 int AddedIndex;
 char DriveName[4] = "A:\\";
 for(char Drive = 'A'; Drive <= 'Z'; Drive++)
 {
  DriveName[0] = Drive;
  switch(GetDriveType(DriveName))
  {
   case DRIVE_REMOVABLE:
                        DriveName[1] = '\0';
                        EnumList->Add("Stacja dyskietek " + (String)Drive + ":");
                        DriveName[1] = ':';
                        break;
   case DRIVE_FIXED:
                        DriveName[1] = '\0';
                        EnumList->Add("Dysk lokalny " + (String)Drive + ":");
                        DriveName[1] = ':';
                        break;
   case DRIVE_CDROM:
                        DriveName[1] = '\0';
                        EnumList->Add("Napęd CD DVD " + (String)Drive + ":");
                        DriveName[1] = ':';
                        break;
   case DRIVE_REMOTE:
                        DriveName[1] = '\0';
                        EnumList->Add("Dysk sieciowy " + (String)Drive + ":");
                        DriveName[1] = ':';
                        break;
   case DRIVE_RAMDISK:
                        DriveName[1] = '\0';
                        EnumList->Add("RAM dysk " + (String)Drive + ":");
                        DriveName[1] = ':';
                        break;
  }
 }
}


pitek przerobił kod po swojemu i pozostawił to co zbędne w nowej wersji kodu. Ja odniosłem się tylko do tego, że kod nie działa, nie zwróciłem uwagi na te zbędne elementy. W pierwotnej wersji kodu te elementy również są zbędne. Przypuszczam, że pozostawiłem je z niedbałości. Nie pamiętam już co chciałem wtedy osiągnąć i jak tworzyłem ten kod.
Podaję poprawne kody:

KOD cpp:     UKRYJ  
void __fastcall EnumDrivers(TStrings *EnumList)
{
 int AddedIndex;
 char DriveName[4] = "A:\\";
 for(char Drive = 'A'; Drive <= 'Z'; Drive++)
 {
  DriveName[0] = Drive;
  switch(GetDriveTypeA(DriveName))
  {
   case DRIVE_REMOVABLE:
                                                EnumList->Add("Stacja dyskietek " + (String)Drive + ":");
                                                break;
   case DRIVE_FIXED:
                                                EnumList->Add("Dysk lokalny " + (String)Drive + ":");
                        break;
   case DRIVE_CDROM:
                                                EnumList->Add("Napęd CD DVD " + (String)Drive + ":");
                        break;
   case DRIVE_REMOTE:
                                                EnumList->Add("Dysk sieciowy " + (String)Drive + ":");
                        break;
   case DRIVE_RAMDISK:
                                                EnumList->Add("RAM dysk " + (String)Drive + ":");
                                                break;
  }
 }
}




KOD cpp:     UKRYJ  
void __fastcall EnumDrivers(TStrings *EnumList)
{
 char DriveName[4] = "A:\\";
 for(char Drive = 'A'; Drive <= 'Z'; Drive++)
 {
  DriveName[0] = Drive;

  if(GetDriveTypeA( DriveName ) == DRIVE_FIXED)
  {
        EnumList->Add((String)Drive + ":\\");
  }
 }
}
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Wyliczanie dysków lokalnych

Nowy postprzez Pitek » piątek, 23 grudnia 2011, 20:44

Tak faktycznie tak było wyrzuciłem zaraz potem te dwie linijki ;)
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 44 gości

cron