Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.01.2012, 20:13   #1
kolyok333
 
Регистрация: 14.01.2012
Сообщений: 5
По умолчанию Не получается найти ошибку в коде нужно определить размеры дисков C++ Borland

Программа компилируется, но когда запускается выскакивает с ошибкой

Помогите пожалуйста!

Код:
void __fastcall TForm1::Button4Click(TObject *Sender)
{
  char szBuffer[1024];
  ::GetLogicalDriveStrings(1024, szBuffer);
   char *pch = szBuffer;
    DWORD FreeBytesAvailable;
    DWORD TotalNumberOfBytes;
    DWORD TotalNumberOfFreeBytes;
   while (*pch)
         {
             Form1->Label4->Caption=Form1->Label4->Caption+"\n"+pch;

    BOOL GetDiskFreeSpaceFlag = ::GetDiskFreeSpaceEx(
         pch,
	(PULARGE_INTEGER)&FreeBytesAvailable,
	(PULARGE_INTEGER)&TotalNumberOfBytes,
	(PULARGE_INTEGER)&TotalNumberOfFreeBytes
	);
           if(GetDiskFreeSpaceFlag != 0)
            {Form1->Label4->Caption=Form1->Label4->Caption+"\n Доступно для использования "+(unsigned long)FreeBytesAvailable/1048576+" Mb";
	    Form1->Label4->Caption=Form1->Label4->Caption+"\n Максимальный объем         "+(unsigned long)TotalNumberOfBytes/1048576+" Mb";
            Form1->Label4->Caption=Form1->Label4->Caption+"\n Свободно на диске          "+(unsigned long)TotalNumberOfFreeBytes/1048576+" Mb";
            }
            else
             Form1->Label4->Caption=Form1->Label4->Caption+ " Диск отсутствует" + "\n";
      pch = &pch[strlen(pch) + 1];
      }
    
}
kolyok333 вне форума Ответить с цитированием
Старый 14.01.2012, 20:16   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

А с какой ошибкой-то?

Ну или дебаггер в руки и вперед, смотреть где вылетает.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 14.01.2012, 20:22   #3
kolyok333
 
Регистрация: 14.01.2012
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
А с какой ошибкой-то?

Ну или дебаггер в руки и вперед, смотреть где вылетает.
Ошибка сначала
Exception Processing Message С000013 Parameters 75b3bf7c 4 75b3bfc 75b3bf7c
Нажимаем на продолжить вылетает следующее
Access violation at adderess 32657EB0 in module 'CC3260MT.DLL. Read of address 0000000

Потом вроде запускается но во первых не показывает все диски а только A и С а во вторых показывает только свободное место, а остальные значения по нулям.
kolyok333 вне форума Ответить с цитированием
Старый 15.01.2012, 11:52   #4
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Зачем Вы это всё в API делаете? Через VCL, всё гораздо проще.

Определение размера диска (VCL вариант)

// Для определения размера диска используйте функцию DiskSize, объявленную в Sysutils.hpp. В параметрах функции диску А соответствует 1, диску В - 2, и т. д., 0 - текущий диск. Следующий код определит размер диска С в байтах.
__int64 Size = DiskSize(3);

Определение свободного пространства на диске (VCL вариант)

// Для определения свободного пространства на диске используйте функцию DiskFree, объявленную в Sysutils.hpp. В параметрах функции диску А соответствует 1, диску В - 2, и т. д., 0 - текущий диск. Следующий код определит размер свободного пространства на диске С в байтах.
__int64 FreeSpace = DiskFree(3);

Список всех доступных дисков можно получить функцией GetLogicalDriveStrings объявленной в файле Winbase.h.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 15.01.2012 в 12:01.
Smitt&Wesson вне форума Ответить с цитированием
Старый 15.01.2012, 15:53   #5
kolyok333
 
Регистрация: 14.01.2012
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
Зачем Вы это всё в API делаете? Через VCL, всё гораздо проще.

Определение размера диска (VCL вариант)

// Для определения размера диска используйте функцию DiskSize, объявленную в Sysutils.hpp. В параметрах функции диску А соответствует 1, диску В - 2, и т. д., 0 - текущий диск. Следующий код определит размер диска С в байтах.
__int64 Size = DiskSize(3);

Определение свободного пространства на диске (VCL вариант)

// Для определения свободного пространства на диске используйте функцию DiskFree, объявленную в Sysutils.hpp. В параметрах функции диску А соответствует 1, диску В - 2, и т. д., 0 - текущий диск. Следующий код определит размер свободного пространства на диске С в байтах.
__int64 FreeSpace = DiskFree(3);

Список всех доступных дисков можно получить функцией GetLogicalDriveStrings объявленной в файле Winbase.h.
Спасибо за совет, но у меня задание такое в лабе. Вроде работать заставил, правда ошибку по прежнему выдает, но когда нажимаешь продолжить, показывает всю нужную информацию. Вот кусок кода может кому пригодиться

Код:
void __fastcall TForm1::Button4Click(TObject *Sender)
{ Form1->Label5->Caption="";
  Form1->Label4->Caption="";
  Form1->Label3->Caption="";
  Form1->Label2->Caption="";
  Form1->Label1->Caption="";
 char szBuffer[1024];
  ::GetLogicalDriveStrings(1024, szBuffer);
   char *pch = szBuffer;
    ULARGE_INTEGER FreeBytesAvailable;
ULARGE_INTEGER TotalNumberOfBytes;
ULARGE_INTEGER TotalNumberOfFreeBytes;

   while (*pch)
         {
             Form1->Label4->Caption=Form1->Label4->Caption+"\n"+pch;

    BOOL GetDiskFreeSpaceFlag = ::GetDiskFreeSpaceEx (pch, &FreeBytesAvailable, &TotalNumberOfBytes, &TotalNumberOfFreeBytes);
           if(GetDiskFreeSpaceFlag != 0)
            {Form1->Label4->Caption=Form1->Label4->Caption+"\nСвободного места на диске "+unsigned (TotalNumberOfFreeBytes.QuadPart / 1024 / 1024)+" Mb\n";
            Form1->Label4->Caption=Form1->Label4->Caption+"Занятого места на диске "+(unsigned (TotalNumberOfBytes.QuadPart / 1024 / 1024)-unsigned (TotalNumberOfFreeBytes.QuadPart / 1024 / 1024))+" Mb\n";
            Form1->Label4->Caption=Form1->Label4->Caption+"Общий объем диска "+unsigned (TotalNumberOfBytes.QuadPart / 1024 / 1024)+" Mb\n";

            }
            else
             Form1->Label4->Caption=Form1->Label4->Caption+ "\n"+" Диск отсутствует" + "\n";
      pch = &pch[strlen(pch) + 1];
      }

}
kolyok333 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
нужно найти ошибку в коде helldog Помощь студентам 0 03.01.2012 07:10
Нужно найти ошибку в коде (C++) lot555 Помощь студентам 4 27.05.2011 09:05
Нужно исправить ошибку в коде Bright-rider Фриланс 2 07.04.2011 13:14
Таймер обратного отсчета работает не так как надо.. нужно найти ошибку в коде... Человек_Борща Общие вопросы Delphi 10 13.04.2010 20:06
Нужно найти ошибку в коде Вован111 Помощь студентам 15 08.11.2009 14:33