Как создать массив ссылок на массивы? - PullRequest
0 голосов
/ 11 февраля 2019

У меня проблемы с синтаксисом в моем коде.Немного контекста ... У моей программы есть расписание, это массив из 24 байтов.Существует один график в день, поэтому 7 массивов.

Я хочу иметь один массив из 7 элементов, хранящий ссылки на вышеупомянутые 7 массивов.Таким образом, вызывая schedule [1], я получаю schedule1 [24], то есть понедельник.

// One schedule per day (0 = sunday)
byte schedule0[24];
byte schedule1[24];
byte schedule2[24];
byte schedule3[24];
byte schedule4[24];
byte schedule5[24];
byte schedule6[24];
byte * schedules[7] = {&schedule0, &schedule1};

Проблема связана с последней строкой, ошибкой является байт «значение типа» (*) [24] "нельзя использовать для инициализации объекта типа" byte * "".

Я попытался вставить [24] до или после символа звезды / указателя, но безуспешно.

Может ли кто-нибудь из вас показать мне правильный синтаксис для этого?

Ответы [ 3 ]

0 голосов
/ 11 февраля 2019

В C++ имя массива является указателем на первый элемент в массиве.Так что в вашем случае schedule0 - это указатель на &schedule0[0], а не &schedule0.

. Вы можете изменить последнюю строку как

byte * schedules[2] = {&schedule0[0], &schedule1[0]}; или byte * schedules[2] = {schedule0, schedule1};

* 1012.* Это создаст массив указателей, содержащий базовый адрес массивов scheduleX.
0 голосов
/ 11 февраля 2019

Я хочу иметь один массив из 7 элементов, хранящий ссылки на вышеупомянутые 7 массивов.Таким образом, вызывая schedule [1], я получаю schedule1 [24], то есть понедельник.

Для индексации по дням необходим другой подход.Это можно сделать с помощью двумерного массива и некоторой арифметики указателей.

Объявите двумерный массив для ваших расписаний:

byte schedulesArray[7][24];

Объявите указатели, которые указывают на расписания на каждый день:

byte *schedule0 = &schedulesArray[0][0];
byte *schedule1 = &schedulesArray[1][0];
byte *schedule2 = &schedulesArray[2][0];
byte *schedule3 = &schedulesArray[3][0];
byte *schedule4 = &schedulesArray[4][0];
byte *schedule5 = &schedulesArray[5][0];
byte *schedule6 = &schedulesArray[6][0];

Объявите указатель на первый элемент двумерного массива:

byte *schedules = &schedulesArray[0][0];

Итак, если мы запустим некоторые данные:

schedule0[0] = 1;

schedule1[0] = 11;
schedule1[1] = 12;

schedule2[0] = 21;
schedule2[1] = 22;

Тогда вы можете использоватьуказатель schedules на индекс по дням:

schedules[0];   // = 1
schedules[24];  // = 11
schedules[25];  // = 12
schedules[48];  // = 21
schedules[49];  // = 22

Это работает, потому что многомерные массивы расположены как непрерывный блок памяти.

0 голосов
/ 11 февраля 2019

Просто вы не можете этого сделать.

И вот объяснение, почему:

По сути, ссылка - это псевдоним существующей переменной.Это означает, что если вы примените какую-либо операцию к ссылке, она будет вести себя так, как если бы вы использовали исходное имя переменной.И нет ссылок на ссылку или указатель на ссылки, ссылки не выделяют никакой памяти, поэтому нет ничего, что вы можете использовать для помещения в массив.

Что вы можете сделать, это создать массив указателейи это будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...