2013-07-13 5 views
2

Я вроде как новичок в C++, и мой вопрос может иметь довольно простое решение, но я не мог понять это сам.Как создать массив байтовых массивов?

Скажем, у меня есть два байта массива и б. Каждый из них содержит шесть байтов. Теперь я хочу ввести новый массив c, который должен содержать a и b.

Это, как я попробовал:

byte a[] = {B11111111, B10010000, B10011000, B10010100, B10010010, B11110001}; 
byte b[] = {B11111111, B10000001, B10000001, B10000001, B10000001, B11111111}; 

byte c[2][6] = {{a},{b}}; 

Компилятор дает мне следующую ошибку:

invalid conversion from 'byte' to 'byte' 
+0

Не важно, что вы путаете сложение и умножение (или, может быть, я должен сказать, профсоюзы и продукты), но решение я предусматривая использование несколько признаков для извлечения размеров массивов и шаблонов переменных номеров индексов для инициализации единого массива объединений от произвольных составляющих. Я думаю, что это может быть немного больше, чем вы искали. –

+0

Ваш вопрос воплощает противоречие в терминах. Байт-массив представляет собой массив байтов. Массив массивов байтов представляет собой массив массивов. – EJP

+0

Итак, вопрос должен быть «как создать массив байтовых массивов». Кажется, я не могу редактировать вопросы на реактивных самолетах. Но в любом случае должно быть какое-то слабое решение. – user1210456

ответ

3

Вы можете сделать это следующим образом:

byte a[] = {B11111111, B10010000, B10011000, B10010100, B10010010, B11110001}; 
byte b[] = {B11111111, B10000001, B10000001, B10000001, B10000001, B11111111}; 

byte* c[2] = {a,b}; 

Но было бы быть чистым, чтобы просто сделать многомерную матрицу напрямую:

byte c[2][6] = { 
    {B11111111, B10010000, B10011000, B10010100, B10010010, B11110001}, 
    {B11111111, B10000001, B10000001, B10000001, B10000001, B11111111} 
}; 
+0

Это работает. Можете ли вы объяснить, почему это чище, чтобы сделать это напрямую и что именно делает байт *. Мне нужно создать многомерный массив позже в коде, потому что a и b представляют растровые изображения для букв, а c - слово. Какое это слово, должно быть переменным. – user1210456

+0

'byte * c [2]' - массив с двумя указателями 'byte'. Массив 'byte []' может быть деградирован в указатель 'byte * '. Поэтому 'c' просто указывает на начальные адреса памяти' a' и 'b', а не на их копии. –

+0

Это чище, если вы просто объявляете их в верхней части своего кода где-то, так как это все в одном, простом объекте без лишних промежуточных объектов (например, a и b). Однако, если у вас есть a и b в любом случае и просто хотите их сдержать, то первое решение имеет больше смысла. Как пояснил Реми, байт * c [2] - это просто массив байтов *, поэтому каждая запись в c [] является указателем - и, следовательно, массивом - сама по себе. Вы можете думать о байте a [] как о том же, что и байт * a. –

1

вы должны сделать цикл для копирования 2 массивов в третий,

for (int i = 0; i < 6; i++) 
{ 
    c[0][i] = a[i]; 
    c[1][i] = b[i]; 
} 
5

Сырые массивы немного раздражает. Используйте std::array вместо:

using std::array; 
array<byte,6> a = {B11111111, B10010000, B10011000, B10010100, B10010010, B11110001}; 
array<byte,6> b = {B11111111, B10000001, B10000001, B10000001, B10000001, B11111111}; 
array<array<byte,6>,2> c = {a, b}; 

std::array был введен в

+0

Это звучит неплохо, но я использую код для arduino, и я получаю следующую ошибку: ожидаемый конструктор, деструктор или преобразование типа перед токеном <<. – user1210456

+0

Это решение также является предложением coorect. Arduino не поддерживает std :: array и std :: vector. Я обозначил решение указателя как правильное, потому что это хорошее решение, и оно работает для меня. Во всяком случае, использование std :: array может быть лучшим решением в некоторых других случаях. Я буду голосовать +1, как только моя репутация позволит. – user1210456

Смежные вопросы