Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

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

чвк белобрысые фембойчики
Разработчик
Разработчик
Статус
Онлайн
Регистрация
21 Июн 2025
Сообщения
202
Реакции
74
не могу понять, почему выводиться не оперативная память, а рандом цифры, реализация функции сделано верно, я 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));
спасибо, помогло
и за бонус тоже
 
Назад
Сверху Снизу