cesp8266compound-literals

Cannot assign address to pointer array?


I am developing a homekit device using ESP8266 and I am unable to programmatically generate services. I need to generate 16 of them. Here is the code I attempted to assign to *service:

homekit_service_t *services[18] = {
  &(homekit_service_t){
    .type = HOMEKIT_SERVICE_ACCESSORY_INFORMATION,
    .characteristics = (homekit_characteristic_t *[]){
      HOMEKIT_CHARACTERISTIC(NAME, "Switch"),
      HOMEKIT_CHARACTERISTIC(MANUFACTURER, "Arduino HomeKit"),
      HOMEKIT_CHARACTERISTIC(SERIAL_NUMBER, "0123456"),
      HOMEKIT_CHARACTERISTIC(MODEL, "ESP8266/ESP32"),
      HOMEKIT_CHARACTERISTIC(FIRMWARE_REVISION, "1.0"),
      HOMEKIT_CHARACTERISTIC(IDENTIFY, my_accessory_identify),
      NULL,
    },
  },
  &(homekit_service_t){
    .type = HOMEKIT_SERVICE_SWITCH,
    .characteristics = (homekit_characteristic_t *[]){
      HOMEKIT_CHARACTERISTIC(NAME, "Switch"),
      &cha_switch_on,
      NULL,
    },
  },
  NULL,
};

However, when I try to generate additional services, using the code below:

services[3] = &(homekit_service_t){
  .type = HOMEKIT_SERVICE_SWITCH,
  .characteristics = (homekit_characteristic_t *[]){
    HOMEKIT_CHARACTERISTIC(NAME, "Switch"),
    &cha_switch_on,
    NULL,
  },
};

The compiler throws this error:

C:\Users\black\OneDrive\Desktop\homekit\my_accessory.c:34:1: error: conflicting types for 'services'
   34 | services[3] = &(homekit_service_t){
      | ^~~~~~~~
C:\Users\black\OneDrive\Desktop\homekit\my_accessory.c:10:20: note: previous definition of 'services' was here
   10 | homekit_service_t *services[18] = {
      |                    ^~~~~~~~
C:\Users\black\OneDrive\Desktop\homekit\my_accessory.c:34:15: error: invalid initializer
   34 | services[3] = &(homekit_service_t){

How can I programmatically generate additional services?


Solution

  • You can't put executable statements like array element assignment outside a function. If you want to do this at top-level, you have to do it as part of the array declaration.

    homekit_service_t *services[18] = {
      &(homekit_service_t){
        .type = HOMEKIT_SERVICE_ACCESSORY_INFORMATION,
        .characteristics = (homekit_characteristic_t *[]){
          HOMEKIT_CHARACTERISTIC(NAME, "Switch"),
          HOMEKIT_CHARACTERISTIC(MANUFACTURER, "Arduino HomeKit"),
          HOMEKIT_CHARACTERISTIC(SERIAL_NUMBER, "0123456"),
          HOMEKIT_CHARACTERISTIC(MODEL, "ESP8266/ESP32"),
          HOMEKIT_CHARACTERISTIC(FIRMWARE_REVISION, "1.0"),
          HOMEKIT_CHARACTERISTIC(IDENTIFY, my_accessory_identify),
          NULL,
        },
      },
      &(homekit_service_t){
        .type = HOMEKIT_SERVICE_SWITCH,
        .characteristics = (homekit_characteristic_t *[]){
          HOMEKIT_CHARACTERISTIC(NAME, "Switch"),
          &cha_switch_on,
          NULL,
        },
      },
      NULL,
      &(homekit_service_t){
        .type = HOMEKIT_SERVICE_SWITCH,
        .characteristics = (homekit_characteristic_t *[]){
          HOMEKIT_CHARACTERISTIC(NAME, "Switch"),
          &cha_switch_on,
          NULL,
        },
      },
    };