Консоль меняет цвет без видимой причины, когда я использую структуру CHAR_INFO - PullRequest
0 голосов
/ 20 января 2020

Я довольно новичок в c ++ и компьютерном программировании в целом, и я пытаюсь сделать гоночную игру на консоли для университетского проекта. В настоящее время я пытаюсь понять, как использовать windows .h и экранные буферы, и я следую онлайн-учебнику. Это мой код:

#include <iostream>
#include <stdio.h>
#include <Windows.h>
#include <conio.h>
#include <ctime>
#define WIDTH 80
#define FIELD_W 70
#define HEIGHT 35
using namespace std;

HANDLE whdl;
HANDLE rhdl;
int main() {
    srand(time(0));

    SMALL_RECT window_size = { 0, 0, WIDTH-1, HEIGHT-1 };

    whdl = GetStdHandle(STD_OUTPUT_HANDLE);
    rhdl = GetStdHandle(STD_INPUT_HANDLE);

    SetConsoleTitle(L"---RAGE RACER---");

    SetConsoleWindowInfo(whdl, TRUE, &window_size);
    COORD buffer_size = { WIDTH, HEIGHT };
    SetConsoleScreenBufferSize(whdl, buffer_size);

    COORD CharacterBufferSize = { WIDTH, HEIGHT };
    COORD CharacterPosition = { 0, 0 };
    SMALL_RECT console_write_area = { 0, 0, WIDTH-1, HEIGHT-1 };
    CHAR_INFO buffer[WIDTH * HEIGHT];

    for (int y = 0; y < HEIGHT; ++y) {
            buffer[WIDTH * y + 1].Char.AsciiChar = (unsigned char)99;
            for (int x = 1; x < FIELD_W; ++x) {
                buffer[x].Char.AsciiChar = ' ';
            }
            buffer[WIDTH * y].Char.AsciiChar = (unsigned char)99;
        }

        WriteConsoleOutput(whdl, buffer, CharacterBufferSize, CharacterPosition, &console_write_area);

        getchar();
    return 0;
}


Я знаю, что для l oop выключен, проблема в том, что всякий раз, когда я запускаю код, консоль покрывается красными пробелами, если я пытаюсь запустить другую программу, она работает нормально, и если я нажимаю клавиши, они, как всегда, написаны белым на черном. Я пользуюсь Visual Studio 2019. Заранее благодарю и извиняюсь за нецензурные выражения, которые я написал, даже не осознавая.

1 Ответ

0 голосов
/ 20 января 2020

buffer изначально неинициализирован, содержит случайный мусор. Вы инициализируете Char член его элементов, но не Attributes член, который все еще является случайным мусором во время вызова WriteConsoleOutput. А Attributes определяет цвет символов.

Формально ваша программа демонстрирует неопределенное поведение при доступе к неинициализированным объектам.

...