Очистка структуры

Рейтинг: 2Ответов: 2Опубликовано: 04.05.2015
struct  RGB
{
    BYTE    rgbtBlue;
    BYTE    rgbtGreen;
    BYTE    rgbtRed;
} img[512*512];

Есть данная структура. Как её можно очистить?

Ответы

▲ 9

Если нужно заполнить её нулями при создании тогда так:

RGB rgb = {};

Это эквивалентно следующему:

RGB rgb = {0, 0, 0};

Если нужно обнулить существующий объект структуры, тогда используем memset:

RGB rgb;
memset(&rgb, 0, sizeof(RGB));

Если нужно обнулить массив структур, тоггда делаем так:

memset(img, 0, sizeof(img))
▲ 7

Так как у нас C++, а не C, предлагаю нормальное ООПное решение, а не "сишный путь" с обнулениями памяти по указателю.

Всё, что нужно сделать — это добавить конструктор:

struct RGB
{
    BYTE rgbtBlue;
    BYTE rgbtGreen;
    BYTE rgbtRed;

    RGB() : rgbtBlue(0), rgbtGreen(0), rgbtRed(0) { }
};

RGB img[512*512];

Если вы пользуетесь современным компилятором, то можете записать проще:

struct RGB
{
    BYTE rgbtBlue = 0;
    BYTE rgbtGreen = 0;
    BYTE rgbtRed = 0;
};

Ну а если вы хотите сэкономить на конструкторе, то просто запишите:

RGB img[512*512] = {};

Если вам нужно обнулить имеющуюся структуру, то можете воспользоваться std::fill:

std::fill(std::begin(img), std::end(img), RGB()); // идеально
std::fill(img, std::end(img), RGB());             // тоже сойдёт
std::fill(img, img + _countof(img), RGB());       // старый VC++

memset — это наследие от C. В C++ можно использовать языковые средства, а не полагаться на низкоуровневые операции с указателями и байтами.

Кроме того, memset не обладает идеальной кросс-платформенностью (впрочем, вы вряд ли встретитесь с таким железом), вы можете столкнуться с "неожиданностями" при добавлении полей сложных типов и так далее.