Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
15 / 15 / 3
Регистрация: 18.05.2019
Сообщений: 851

Правильно ли пишу код, непонятны результаты функции GetDiskFreeSpaceEx

05.02.2021, 17:24. Показов 2075. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Правильно ли пишу код, непонятны результаты в цикле, функции GetDiskFreeSpaceEx.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
struct diskSpace
{
unsigned __int64 lpFreeBytesAvailableToCaller;
unsigned __int64 lpTotalNumberOfBytes;
unsigned __int64 lpTotalNumberOfFreeBytes;
BOOL diskflag;
};
 
class diskInfo
{
private:
    TCHAR *szLogicalDrives;
    TCHAR **drives;
    unsigned short diskCount;
    diskSpace *diskArr;
. . .
    diskArr = new diskSpace[diskCount];
    for(unsigned short i = 0; i << diskCount; i++)
    {
        diskArr[i].diskflag = ::GetDiskFreeSpaceEx(drives[i], (PULARGE_INTEGER)&diskArr[i].lpFreeBytesAvailableToCaller, 
        (PULARGE_INTEGER)&diskArr[i].lpTotalNumberOfBytes, (PULARGE_INTEGER)&diskArr[i].lpTotalNumberOfFreeBytes);
    }
Добавлено через 35 минут
Функция GetDiskFreeSpaceEx, при выводе результатов на консоль, выводит неверные, однотипные значения.
До создания массива структур *diskArr, работала нормально.

Добавлено через 3 минуты
то есть без индексации, и в единичном варианте.

Добавлено через 42 секунды
без заполнения массива структур.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.02.2021, 17:24
Ответы с готовыми решениями:

Ошибка в функции GetDiskFreeSpaceEx
Всем здравствуйте! Необходимо получить объем жесткого диска. Вроде все просто, нашел кучу примеров, но не могу откомпилить у себя, вроде...

Помогите правильно вставить функции assign и т.д чтобы вывело результаты в файл
есть программа const n=20; var a:array of integer; i:byte; sm:integer; begin writeln('Введите ',n,' элементов...

Не могу правильно понять какие результаты возвратят функции с логическими операторами
Добрый день! Сам программирую на С++, с Lua знаком буквально 3 дня. У меня есть пример работы функции, написанной на Lua, эту функцию я...

12
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
05.02.2021, 17:46
del

Добавлено через 10 минут
DenAlpetyan,
C++
18
i << diskCount
1
15 / 15 / 3
Регистрация: 18.05.2019
Сообщений: 851
05.02.2021, 17:48  [ТС]
Вот весь код.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <conio.h>
#include "diskInfo.h"
 
//#ifndef _UNICODE
//#define _UNICODE
//#endif
 
#ifndef UNICODE
#define UNICODE
#endif
 
int main()
{
diskInfo di;
 
di.getLogDisks();
di.spaceDisks();
di.printConsolDisks();
di.freeArrDisks();
 
_getch();
return 0;
}
diskInfo.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include "diskInfo.h"
 
diskInfo::diskInfo()
{
}
 
diskInfo::~diskInfo()
{
}
 
void diskInfo::getLogDisks()
{
    DWORD nBufferLength = ::GetLogicalDriveStrings(0, NULL);
    // Каждая такая строка закрыта двоичным нулем. Последняя строка будет закрыта двумя двоичными нулями.
    szLogicalDrives = new TCHAR[nBufferLength];
    DWORD dwResult = ::GetLogicalDriveStrings(nBufferLength,  // размер буфера. 
    szLogicalDrives); // адрес буфера для записи сведений об устройствах.
 
    diskCount = dwResult/4;
    drives = new TCHAR*[diskCount];
 
    unsigned short k = 0;
    for(unsigned short i = 0; i < diskCount; i++)
    {
        drives[i] = new TCHAR[4];
        for(unsigned short j = 0; j < 4; j++)
        {
            drives[i][j] = szLogicalDrives[k + j];
        }
        k += 4;
    }
}
 
void diskInfo::spaceDisks()
{
    diskArr = new diskSpace[diskCount];
    unsigned short i = 0;
    diskArr[i].lpFreeBytesAvailableToCaller = 0;
    diskArr[i].lpTotalNumberOfBytes = 0;
    diskArr[i].lpTotalNumberOfFreeBytes = 0;
 
    for(; i << diskCount; i++)
    {
        diskArr[i].diskflag = ::GetDiskFreeSpaceEx(drives[i], (PULARGE_INTEGER)&diskArr[i].lpFreeBytesAvailableToCaller, 
        (PULARGE_INTEGER)&diskArr[i].lpTotalNumberOfBytes, (PULARGE_INTEGER)&diskArr[i].lpTotalNumberOfFreeBytes);
    }
}
 
void diskInfo::printConsolDisks()
{
    for(unsigned short i = 0; i < diskCount; i++)
    {
        std::wcout << drives[i];
        //std::wcout << _T(" There is a disk: ") << diskArr[i].diskflag;
        std::wcout << _T(" Total disk space: ") << diskArr[i].lpTotalNumberOfBytes;
        std::wcout << _T(" Disk free: ") << diskArr[i].lpTotalNumberOfFreeBytes;
        std::wcout << std::endl;
    }
}
 
void diskInfo::freeArrDisks()
{
    delete [] diskArr;
    for(unsigned short i = 0; i < diskCount; i++)
    {
        delete [] drives[i];
    }
    delete [] drives;
    delete [] szLogicalDrives;
}
diskInfo.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/#define _CRT_SECURE_NO_WARNINGS
//#pragma once
 
//#ifndef _UNICODE
#define _UNICODE
//#endif
 
//#ifndef UNICODE
#define UNICODE
//#endif
 
#include <Windows.h>
//#include <fileapi.h>
//#include <setupapi.h>
#include <tchar.h>
#include <iostream>
 
struct diskSpace
{
unsigned __int64 lpFreeBytesAvailableToCaller;
unsigned __int64 lpTotalNumberOfBytes;
unsigned __int64 lpTotalNumberOfFreeBytes;
BOOL diskflag;
};
 
class diskInfo
{
private:
    TCHAR *szLogicalDrives;
    TCHAR **drives;
    unsigned short diskCount;
    diskSpace *diskArr;
public:
    diskInfo::diskInfo();
    diskInfo::~diskInfo();
    void getLogDisks();
    void spaceDisks();
    UINT getTypeDrive(LPCTSTR lpRootPathName);
    void printConsolDisks();
    void freeArrDisks();
};

Выводимые значения в консоли, не соответствуют реальным значениям размеров дисков.
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
05.02.2021, 17:52
DenAlpetyan, diskinfo.cpp
C++
42
for(; i << diskCount; i++)
0
15 / 15 / 3
Регистрация: 18.05.2019
Сообщений: 851
05.02.2021, 17:57  [ТС]
liv, Спасибо заработало, только раньше DWD - ROM F:\, ноль показывал, а теперь.
0
15 / 15 / 3
Регистрация: 18.05.2019
Сообщений: 851
05.02.2021, 18:11  [ТС]
liv, спасибо,
Цитата Сообщение от liv Посмотреть сообщение
42
for(; i << diskCount; i++)
исправил уже. Я про диск F:\ DWD - rom, что там не ноль.

Добавлено через 4 минуты
Хотя читает, что диска нет.

Добавлено через 3 минуты
От чего может быть.
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
05.02.2021, 18:15
DenAlpetyan, перед выводом надо бы проверить поле diskArr[i].diskflag.
Если диска нет, то там false

Добавлено через 3 минуты
Соответственно, в полях - мусор, т.к. ничего не определяет
1
15 / 15 / 3
Регистрация: 18.05.2019
Сообщений: 851
05.02.2021, 18:33  [ТС]
liv, так и делаю(раскомментировал строку diskinfo.cpp 54), там ноль, но и выводил раньше ноль в других wcout связанных диском F:\ DWD - ROM.
Или непредсказуемо, или максимальный размер выдает ?

Добавлено через 1 минуту
liv, понял, тема закрыта.

Добавлено через 3 минуты
MSDN Функция GetDiskFreeSpaceEx возвращает ноль (0) для lpTotalNumberOfFreeBytes и lpFreeBytesAvailable для всех запросов компакт-диска, если только это не незаписанный компакт-диск в приводе CD-RW.

Добавлено через 4 минуты
Выводимое число стабильно одинаковое.
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
05.02.2021, 18:39
DenAlpetyan, попробуйте запустить со вставленным диском в привод
0
15 / 15 / 3
Регистрация: 18.05.2019
Сообщений: 851
05.02.2021, 18:47  [ТС]
liv, Пишет точное число занятых байт, свободных ноль.
Вынул диск,

нажимаю продолжить, тоже число.
0
15 / 15 / 3
Регистрация: 18.05.2019
Сообщений: 851
05.02.2021, 18:49  [ТС]
что - то, не хватает, какой - то или каких - то функций winapi, в моей программе для правильной работы.
или алгоритма.
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
05.02.2021, 18:54
DenAlpetyan, флаг при этом анализируется? Если флаг == false, то не надо выводить.
0
15 / 15 / 3
Регистрация: 18.05.2019
Сообщений: 851
05.02.2021, 19:02  [ТС]
liv, я вас понял, спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.02.2021, 19:02
Помогаю со студенческими работами здесь

Непонятны функции
Или ссылку на нее..

Непонятны некоторые функции
Непонятны следующие функции, что они выполняют: (char)((int)('a')+j)) break; // что значит эта запись? char PROC(char s) // почему...

Непонятны разные функции библиотеки cctype
Код #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;cctype&gt; void strcount(const std::string &amp; str); int main() { ...

Нужно разобрать код, как он работает последовательно, что откуда и куда, некоторые моменты непонятны
function showPrimes(n) { for (let i = 2; i &lt; n; i++) { if(!isPrime(i)) continue; alert(i); } } ...

Код читаю, а сам пишу с трудом. Код внутри
Много учил, читал. На бесплатных обучалках проходил курсы. В общем и целом, читать код я могу, понимаю(я не хвастаюсь, я многого не знаю)....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru