Недопустимое преобразование из ошибки 'uint16_t* при создании массива элементов uint16_t

Я хотел бы создать массив кодов удаленного управления, предоставляемый функцией необработанного чтения библиотеки irlib2.

irlib2 предоставляет следующие массивы uint16t в следующем формате:

#define RAW_DATA_LEN 68

const uint16_t powerOff[RAW_DATA_LEN]={
  8550, 4306, 530, 1606, 530, 566, 502, 1610, 
  530, 566, 502, 574, 506, 1630, 506, 566, 
  506, 1630, 506, 566, 502, 1610, 530, 566, 
  502, 1634, 506, 1606, 530, 570, 498, 1634, 
  506, 570, 510, 562, 506, 566, 502, 1634, 
  506, 1606, 530, 1610, 530, 562, 538, 538, 
  530, 542, 538, 1598, 538, 1570, 558, 542, 
  538, 538, 530, 542, 538, 1598, 530, 1578, 
  558, 1578, 562, 1000};

Я хотел бы создать массив из этих массивов, используя приведенный ниже код, но получил следующие ошибки.

КОД

#define RAW_DATA_LEN 68

const uint16_t powerOff[RAW_DATA_LEN]={
  8550, 4306, 530, 1606, 530, 566, 502, 1610, 
  530, 566, 502, 574, 506, 1630, 506, 566, 
  506, 1630, 506, 566, 502, 1610, 530, 566, 
  502, 1634, 506, 1606, 530, 570, 498, 1634, 
  506, 570, 510, 562, 506, 566, 502, 1634, 
  506, 1606, 530, 1610, 530, 562, 538, 538, 
  530, 542, 538, 1598, 538, 1570, 558, 542, 
  538, 538, 530, 542, 538, 1598, 530, 1578, 
  558, 1578, 562, 1000};

uint16_t sourceCD[RAW_DATA_LEN]={
  8546, 4310, 558, 1578, 562, 538, 498, 1638, 
  530, 542, 506, 570, 502, 1634, 502, 570, 
  498, 1638, 534, 538, 498, 1638, 530, 542, 
  506, 1606, 554, 1582, 558, 538, 510, 1602, 
  554, 546, 506, 566, 502, 570, 510, 1602, 
  554, 1582, 558, 538, 510, 566, 502, 1606, 
  554, 546, 502, 1610, 558, 1574, 554, 546, 
  502, 570, 510, 1602, 526, 1610, 526, 574, 
  506, 1602, 526, 1000};

uint16_t sourceAUX[RAW_DATA_LEN]={
  8550, 4310, 526, 1634, 506, 566, 502, 1634, 
  506, 566, 502, 574, 506, 1626, 510, 566, 
  506, 1630, 506, 566, 502, 1634, 506, 566, 
  502, 1634, 506, 1606, 530, 566, 506, 1630, 
  506, 566, 502, 1634, 506, 1630, 506, 1630, 
  510, 1602, 526, 570, 510, 566, 502, 1634, 
  502, 570, 502, 570, 510, 566, 502, 570, 
  510, 562, 506, 1630, 506, 1630, 510, 562, 
  506, 1630, 510, 1000};

uint16_t sourceCDR[RAW_DATA_LEN]={
  8550, 4306, 530, 1606, 534, 566, 502, 1606, 
  534, 566, 502, 570, 510, 1602, 526, 570, 
  510, 1602, 534, 566, 502, 1606, 534, 566, 
  506, 1602, 530, 1606, 534, 566, 502, 1610, 
  530, 570, 498, 574, 506, 566, 502, 570, 
  510, 1602, 526, 570, 510, 566, 502, 570, 
  510, 1602, 526, 1610, 526, 1606, 534, 1602, 
  534, 566, 502, 1610, 530, 1602, 534, 1602, 
  526, 574, 506, 1000};

//Это код проблемы:
uint16_t sources[3] = {sourceCD, sourceAUX,  sourceCDR};

ОШИБКИ

warning: invalid conversion from 'uint16_t* {aka unsigned int*}' to 'uint16_t {aka unsigned int}' [-fpermissive]
 uint16_t sources[3] = {sourceCD, sourceAUX,  sourceCDR};
warning: invalid conversion from 'uint16_t* {aka unsigned int*}' to 'uint16_t {aka unsigned int}' [-fpermissive]
warning: invalid conversion from 'uint16_t* {aka unsigned int*}' to 'uint16_t {aka unsigned int}' [-fpermissive]

Я понимаю, что это как-то связано со смешиванием и преобразованием недопустимых типов, но я не совсем понимаю, что делать дальше

, 👍0

Обсуждение

sources — это массив указателей на массивы, поэтому uint16_t* source[] = {sourceCD, sourceAUX, sourceCDR};. переменная массива является указателем на местоположение первого члена, @Juraj

Это не совсем исправляет ситуацию. Я все еще получаю эту ошибку 3 раза: предупреждение: неверное преобразование из 'const uint16_t* {aka const unsigned int*}' в 'uint16_t* {aka unsigned int*}' [-fpermissive] Я также пробовал uint16_t *sources[ ] = {sourceCD, sourceAUX, sourceCDR}. Есть еще идеи?, @Aaron Ciuffo

Я не заметил, что ваш первый массив является константным, а другие — нет. сделать все const. позиция * не имеет значения. вам следует прочитать сообщения об ошибках/предупреждениях., @Juraj

@Юрай Я тоже это заметил, но не уверен, что в предупреждениях указывало бы на проблему. Можете ли вы помочь мне понять предупреждающее сообщение?, @Aaron Ciuffo

Я думаю, что сообщения об ошибках в вашем Вопросе не относятся к коду с Вопросом. в первом сообщении об ошибке упоминалась бы константа. в сообщениях говорится, что вы пытаетесь использовать uint16_t* там, где ожидается uint16_t, @Juraj


1 ответ


Лучший ответ:

2

У вас есть два варианта.

  1. Вы можете создать массив из массивов следующим образом:
const uint16_t sources[3][RAW_DATA_LEN] = {
    { 8546, 4310, 558, ... }, // CD
    { 8550, 4310, 526, ... }, // AUX
    { 8550, 4306, 530, ... }  // CDR
};

Но тогда у вас больше не будет переменных sourceCD и т. д. Если вы хотите, вы можете #define использовать псевдонимы для них следующим образом:

#define sourceCD  (sources[0])
#define sourceAUX (sources[1])
#define sourceCDR (sources[2])
  1. Вы можете создать массив указателей, как предложено в комментариях:
const uint16_t sourceCD[RAW_DATA_LEN]  = { 8546, 4310, 558, ... };
const uint16_t sourceAUX[RAW_DATA_LEN] = { 8550, 4310, 526, ... };
const uint16_t sourceCDR[RAW_DATA_LEN] = { 8550, 4306, 530, ... };
const uint16_t *sources[3] = { sourceCD, sourceAUX,  sourceCDR };

Это работает, потому что в последней строке идентификаторы массива, такие как sourceCD неявно «распадается» до указателей на свои первые элементы. Примечание ключевое слово const в последней строке, необходимое для согласованности с типы объявленных выше массивов.

,