Вопрос Неправильный вывод оперативной памяти

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
21 Июн 2025
Сообщения
95
Реакции
5
не могу понять, почему выводиться не оперативная память, а рандом цифры, реализация функции сделано верно, я 1000 раз перепроверил, сравнил с синтаксисом GlobalMemoryStatusEx, проверил, правильно ли обращаюсь к структуре, все верно
main.c:
Expand Collapse Copy
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <locale.h>

void SystemInfo() {
    SYSTEM_INFO sysInfo;
    GetSystemInfo(&sysInfo);
    DWORD processors = sysInfo.dwNumberOfProcessors;
}

void Information() {
    SYSTEM_INFO sysInfo;
    GetSystemInfo(&sysInfo);
    WORD arhtic = sysInfo.wProcessorArchitecture;
    if (arhtic == PROCESSOR_ARCHITECTURE_AMD64)
    {
        printf("x64 Architecture \n");
    }
    else
    {
        printf("x86 Architecture \n");
    }
}

void GlobalMemory() {
    MEMORYSTATUSEX memoryInfo;
    memoryInfo.dwLength = sizeof(memoryInfo);
    GlobalMemoryStatusEx(&memoryInfo);
    DWORDLONG operative = memoryInfo.ullAvailPhys;
    printf("memory = %d\n", operative);
}

void GetCurrentUser() {
    char buffer[256];
    DWORD size = 256;

    if (GetUserNameA(buffer, &size)) {
        printf("Username = %s\n", buffer);
    }
    else
    {
        printf("Error no UserName!\n");
    }

}

void NamePC() {
    char buffer[256];
    DWORD size = 256;

    if (GetComputerNameA(buffer, &size))
    {
        printf("Computer Name = %s\n", buffer);
    }
    else
    {
        printf("Error name Computer!\n");
    }
}

void CollectSystemInf() {
    SystemInfo();
    Information();
    GlobalMemory();
    GetCurrentUser();
    NamePC();
}

void CreateFilesOrWriteFile() {
    HANDLE system = CreateFileA(
        "D:\\system_info.txt",
        GENERIC_WRITE,
        0,
        NULL,
        CREATE_ALWAYS,
        FILE_ATTRIBUTE_NORMAL,
        NULL
    );
    char data[] = "System Information:\n";
    DWORD bytesWritten;
    BOOL write = WriteFile(
        system,
        data,
        (DWORD)strlen(data),
        &bytesWritten,
        NULL
    );

    CloseHandle(system);
}

int main()
{
    SystemInfo();
    Information();
    GlobalMemory();
    GetCurrentUser();
    NamePC();
    CollectSystemInf();
    CreateFilesOrWriteFile();
    return 0;
}

1759839527178.png


Причем, компилятор обращается именно к принтф-у, я вроде все верно передал, хелп
 
Последнее редактирование:
#include <inttypes.h> // добавь это

void GlobalMemory() {
MEMORYSTATUSEX memoryInfo;
memoryInfo.dwLength = sizeof(memoryInfo);
GlobalMemoryStatusEx(&memoryInfo);
printf("memory = %" PRIu64 "\n", memoryInfo.ullAvailPhys);
}

Попробуй
 
Привет! Проблема в том, что ты используешь неправильный спецификатор формата в printf.

DWORDLONG — это 64-битное целое число (typedef unsigned long long), а %d предназначен для 32-битных int. Когда printf считывает аргументы со стека, он интерпретирует только младшие 32 бита твоего 64-битного значения, поэтому ты и видишь случайные числа.

Решение: используй правильный спецификатор формата для 64-битных чисел.

Вариант 1 (самый простой):
Код:
Expand Collapse Copy
#include <inttypes.h>

void GlobalMemory() {
    MEMORYSTATUSEX memoryInfo;
    memoryInfo.dwLength = sizeof(memoryInfo);
    GlobalMemoryStatusEx(&memoryInfo);
    
    // Используем макрос PRIu64 для кроссплатформенности
    printf("memory = %" PRIu64 " bytes\n", memoryInfo.ullAvailPhys);
    // Или для мегабайт:
    printf("memory = %" PRIu64 " MB\n", memoryInfo.ullAvailPhys / (1024 * 1024));
}

Вариант 2 (без inttypes.h):
Код:
Expand Collapse Copy
void GlobalMemory() {
    MEMORYSTATUSEX memoryInfo;
    memoryInfo.dwLength = sizeof(memoryInfo);
    GlobalMemoryStatusEx(&memoryInfo);
    
    // Используем %llu для unsigned long long
    printf("memory = %llu bytes\n", memoryInfo.ullAvailPhys);
}

Почему это работает:
%d — для int (32 бита)
%lld — для signed long long (64 бита)
%llu — для unsigned long long (64 бита)
%" PRIu64 — макрос из <inttypes.h>, который автоматически подставляет правильный спецификатор для uint64_t

DWORDLONG определён как unsigned __int64 (то есть unsigned long long), поэтому нужен именно %llu или макрос PRIu64.

Бонус: если хочешь видеть память в ГБ/МБ, добавь:
Код:
Expand Collapse Copy
printf("Available RAM: %.2f GB\n", memoryInfo.ullAvailPhys / (1024.0 * 1024.0 * 1024.0));
 
Привет! Проблема в том, что ты используешь неправильный спецификатор формата в printf.

DWORDLONG — это 64-битное целое число (typedef unsigned long long), а %d предназначен для 32-битных int. Когда printf считывает аргументы со стека, он интерпретирует только младшие 32 бита твоего 64-битного значения, поэтому ты и видишь случайные числа.

Решение: используй правильный спецификатор формата для 64-битных чисел.

Вариант 1 (самый простой):
Код:
Expand Collapse Copy
#include <inttypes.h>

void GlobalMemory() {
    MEMORYSTATUSEX memoryInfo;
    memoryInfo.dwLength = sizeof(memoryInfo);
    GlobalMemoryStatusEx(&memoryInfo);
   
    // Используем макрос PRIu64 для кроссплатформенности
    printf("memory = %" PRIu64 " bytes\n", memoryInfo.ullAvailPhys);
    // Или для мегабайт:
    printf("memory = %" PRIu64 " MB\n", memoryInfo.ullAvailPhys / (1024 * 1024));
}

Вариант 2 (без inttypes.h):
Код:
Expand Collapse Copy
void GlobalMemory() {
    MEMORYSTATUSEX memoryInfo;
    memoryInfo.dwLength = sizeof(memoryInfo);
    GlobalMemoryStatusEx(&memoryInfo);
   
    // Используем %llu для unsigned long long
    printf("memory = %llu bytes\n", memoryInfo.ullAvailPhys);
}

Почему это работает:
%d — для int (32 бита)
%lld — для signed long long (64 бита)
%llu — для unsigned long long (64 бита)
%" PRIu64 — макрос из <inttypes.h>, который автоматически подставляет правильный спецификатор для uint64_t

DWORDLONG определён как unsigned __int64 (то есть unsigned long long), поэтому нужен именно %llu или макрос PRIu64.

Бонус: если хочешь видеть память в ГБ/МБ, добавь:
Код:
Expand Collapse Copy
printf("Available RAM: %.2f GB\n", memoryInfo.ullAvailPhys / (1024.0 * 1024.0 * 1024.0));
спасибо, помогло
и за бонус тоже
 
Назад
Сверху Снизу