Очистка структуры
struct RGB
{
BYTE rgbtBlue;
BYTE rgbtGreen;
BYTE rgbtRed;
} img[512*512];
Есть данная структура. Как её можно очистить?
struct RGB
{
BYTE rgbtBlue;
BYTE rgbtGreen;
BYTE rgbtRed;
} img[512*512];
Есть данная структура. Как её можно очистить?
Если нужно заполнить её нулями при создании тогда так:
RGB rgb = {};
Это эквивалентно следующему:
RGB rgb = {0, 0, 0};
Если нужно обнулить существующий объект структуры, тогда используем memset
:
RGB rgb;
memset(&rgb, 0, sizeof(RGB));
Если нужно обнулить массив структур, тоггда делаем так:
memset(img, 0, sizeof(img))
Так как у нас 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
не обладает идеальной кросс-платформенностью (впрочем, вы вряд ли встретитесь с таким железом), вы можете столкнуться с "неожиданностями" при добавлении полей сложных типов и так далее.