Как я могу использовать fill_n () в следующем массиве? - PullRequest
2 голосов
/ 22 декабря 2011

У меня есть этот массив

 unsigned char        bit_table_[10][100];

Как правильно заполнить его 0. Я пробовал

std::fill_n(bit_table_,sizeof(bit_table_),0x00);

, но vc 2010 помечает его как ошибку.

Ответы [ 3 ]

3 голосов
/ 22 декабря 2011

При инициализации:

unsigned char bit_table_[10][100] = {};

Если это член класса, вы можете инициализировать его в конструкторе, например:

MyClass::MyClass()
    :bit_table_()
{}

В противном случае:

std::fill_n(*bit_table_,sizeof(bit_table_),0);
2 голосов
/ 22 декабря 2011

Тип bit_table_ равен unsigned char [10][100], который будет затухать (то есть компилятор позволяет неявно преобразовывать его в) в unsigned char (*)[100], то есть указатель на массив 100 unsigned chars.

std::fill_n(bit_table_, ...) затем создается как: std::fill_n(unsigned char (*)[100], ...), что означает, что оно ожидает значение типа unsigned char [100] для инициализации bit_table_ с. 0 не конвертируется в этот тип, поэтому компиляция не удалась.

Еще один способ думать об этом - то, что функции STL, которые имеют дело с итераторами, имеют дело только с одним измерением. Если вы передаете многомерную структуру, эти функции STL будут работать только с одним измерением.

В конце концов, вы не можете этого сделать; нет способа присвоить типу массива. То есть, поскольку вы не можете сделать это:

char table[100];
char another_table[100]= { };
table= another_table;

вы не можете использовать std::fill_n для многомерных массивов.

0 голосов
/ 22 декабря 2011

Вы также можете попробовать unsigned char bit_table_[10][100]= { 0 }, чтобы заполнить его нулями.

int main()
{
    unsigned char        bit_table_[10][100]= { 0 };
    return 0;

}
...