Недопустимое преобразование из ошибки '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]
Я понимаю, что это как-то связано со смешиванием и преобразованием недопустимых типов, но я не совсем понимаю, что делать дальше
@Aaron Ciuffo, 👍0
Обсуждение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])
- Вы можете создать массив указателей, как предложено в комментариях:
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
в последней строке, необходимое для согласованности с
типы объявленных выше массивов.
- Изменить строку типа данных
- Как получить тип данных переменной?
- Использование VS1838B с Arduino
- Преобразование в Unix Timestamp и обратно
- Как выбрать вывод передачи в библиотеке IRremote для Arduino Uno?
- Как увеличить расстояние обнаружения на датчике обхода препятствий Arduino KY-032?
- Невозможно создать массив типа const char*
- ардуино - миллисекунды ()
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