2016-09-22 5 views
-1

Вот что я делаю:Присвоить указатель на константные

const uint16_t LAYERS_RIGHT[TOTAL_LAYERS][NBROW][NBCOL] = { 
    {{c00, c10, c20, c30, c40, c50, c60}, 
    {c01, c11, c21, c31, c41, c51, c61}, 
    {c02, c12, c22, c32, c42, c52, c62}, 
    {c03, c13, c23, c33, c43, c53, c63}, 
    {c04, c14, c24, c34, c44, c54, c64}, 
    {c05, c15, c25, c35, c45, c55, c65}} 
    /* blah blah */ 
}; 
const uint16_t LAYERS_LEFT[TOTAL_LAYERS][NBROW][NBCOL] = { 
    /* blah blah */ 
    /* blah blah */ 
}; 

uint16_t *(LAYERS[TOTAL_LAYERS][NBROW][NBCOL]); 

Моя цель попытаться сделать указатель на что либо правая структура или левая структура:

LAYERS = &LAYERS_RIGHT; 

Компилятор говорит:

error: incompatible types in assignment of 
'const uint16_t (*)[7][6][7] {aka const unsigned int (*)[7][6][7]}' to 
'uint16_t* [7][6][7]   {aka unsigned int* [7][6][7]}' 

Как заставить мой код работать?

+1

1) Там нет структуры. 'LAYERS_ *' - массивы. 2) Примечание. Все имена верхнего регистра должны использоваться для макросов и констант ** только **. 3) Ардуино ** не ** C! 4) Пожалуйста, возьмите книгу начинающих C++. Фрагменты полностью неправильны. 5) Код отсутствует. – Olaf

+2

Ответ лежит на ошибке. – 2501

+0

* Arduino не C! * Это стоит повторить. –

ответ

1

У вас есть LAYERS, определяемый как трехмерный массив указателей. Вы хотите константный указатель на 3D-массив:

const uint16_t (*LAYERS)[TOTAL_LAYERS][NBROW][NBCOL]; 

Чтобы использовать это, однако, вы должны использовать синтаксис, как это:

(*LAYERS)[a][b][c]; 

Если вы хотите индексировать LAYERS в качестве 3D-массива, вы можете вместо того, чтобы определить его как это:

const uint16_t (*LAYERS)[NBROW][NBCOL]; 

Назначайте это следующим образом:

LAYERS = LAYERS_RIGHT; 

Это использует тот факт, что в некоторых контекстах массив распадается на указатель на первый элемент. Вышеуказанное назначение - одно из них.

LAYERS_RIGHT является массивом const uint16_t [NBROW][NBCOL], поэтому тип адреса одного из этих элементов массива является const uint16_t (*)[NBROW][NBCOL], который является типом LAYERS.

Затем LAYERS[0] ссылается на первые const uint16_t [NBROW][NBCOL], LAYERS[1], второе и так далее.

Таким образом, после вышеуказанных назначений, это выражение

LAYERS_RIGHT[a][b][c]; 

Урожайность такое же значение, как это выражение:

LAYERS[a][b][c]; 
+0

Указатель на 2D-массив был бы более« естественным », так как это тот же параметр 3D-массива преобразуется в. – Olaf

+0

@Olaf Хорошая точка. Ред. – dbush

+0

Мне было бы лучше, если бы вы поняли, почему ** это работает. Слишком много путаницы в указателях и массивах. – Olaf

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