Проблемы с синтаксисом c - определение const * const * - PullRequest
0 голосов
/ 24 апреля 2018

У меня проблемы с использованием функции, которая определена следующим образом:

some_function(address_t const * const * my_addrs, uint8_t length)

Когда адрес address_t определен как:

typedef struct
{
  uint8_t addr_id   : 1;       
  uint8_t addr_type : 7;       
  uint8_t addr[6]; 
} address_t;

Как я должен вызывать эту функцию?

Код взят из библиотеки Bluetooth и должен устанавливать белый список адресов Bluetooth.Таким образом, идея состоит в том, чтобы определить множественные структуры address_t с различной информацией addr [6].

Большое спасибо за любую помощь

edit: вот еще некоторая информация

Iиметь несколько структур addres_t.Они определены так:

address_t addr1 = {.addr_id= 1, .addr_type = 3, .addr = {0x12,0x34,0x56,0x78,0x90,0xAB}};
address_t addr2 = ...

Я могу затем объединить в массив, например:

address_t my_whitelist[6];
my_whitelist[0] = addr1;
my_whitelist[1] = addr2;
...

Я не уверен, нужно ли это или нет.Теперь я должен передать это как эту функцию.Я надеюсь, что эта дополнительная информация поможет.

1 Ответ

0 голосов
/ 24 апреля 2018

Как мне вызвать эту функцию?

Пример вызова

typedef struct {
  uint8_t addr_id :1;
  uint8_t addr_type :7;
  uint8_t addr[6];
} address_t;

//                      1st const,  2nd const
//                          v---v   v---v
int some_function(address_t const * const * my_addrs, uint8_t length) {
  (void) my_addrs;
  (void) length;
  return 0;
}

int foo() {
  const address_t addr1 = { .addr_id = 1, .addr_type = 3, .addr = { 1,2,3,4,5,6 } };
  const address_t addr2 = { .addr_id = 1, .addr_type = 3, .addr = { 1,2,3,4,5,6 } };
  const address_t addr3 = { .addr_id = 1, .addr_type = 3, .addr = { 1,2,3,4,5,6 } };

Обратите внимание на изменение типа my_whitelist[]. Это должен быть массив указателей. Эти указатели должны указывать на const данные из-за 1st const выше.

  // address_t my_whitelist[6];
  const address_t *my_whitelist[6];
  my_whitelist[0] = &addr1;
  my_whitelist[1] = &addr2;
  my_whitelist[2] = &addr3;
  my_whitelist[3] = &addr1;
  my_whitelist[4] = &addr2;
  my_whitelist[5] = &addr1;
  uint8_t len = sizeof my_whitelist / sizeof my_whitelist[0];

Обратите внимание: my_whitelist[] делает не необходимым для const из-за 2nd const выше, как с const address_t * const my_whitelist[6];. Это 2nd const выше сообщает вызывающему коду, что some_function() не изменит элементы массива my_whitelist[].

  return some_function(my_whitelist, len);
}

Примечание. Если my_whitelist[] был массивом const, его значения не могут быть назначены , но могут быть инициализированы .

// Example usage with a `const my_whitelist[]`
const address_t * const my_whitelist[] = { &addr1, &addr2, &addr3 };

Примечание: address_t const * похоже на const address_t *. Начало с const соответствует стилю спецификации C.

address_t const * const * my_addrs;
// same as 
const address_t * const * my_addrs;  // More common
...