Элемент инициализатора C не является константой - указатели в структуре

Фрагменты кода приведены ниже

/// System Parameters for the gateway
typedef struct {
    bool        mobile_gateway;         // true = GPS receiver used, else false
    uint16_t    gw_ordinal_number;      // Starting at 1, the ordinal gateway number
} CONFIG_SYSTEM_PARMS;


// Data types for the system parameters
typedef enum {
    CFGPARM_TYPE_BOOL,
    CFGPARM_TYPE_UINT,
    CFGPARM_TYPE_INT,
    CFGPARM_TYPE_DOUBLE,

    CFGPARM_NUM_TYPES
} CONFIG_PARM_DATA_TYPES;    


// These mnemonic names and data types correspond to the system parameters
#define SYS_PARM_MOBILE_GATEWAY_MNEM    "MOBILEGW"
#define SYS_PARM_GATEWAY_NUMBER_MNEM    "GWNUM"
#define SYS_PARM_MOBILE_GATEWAY_TYPE    CFGPARM_TYPE_BOOL
#define SYS_PARM_GATEWAY_NUMBER_TYPE    CFGPARM_TYPE_UINT


typedef struct {
    char        FILLER;         // TODO - Define User Parms later...
} CONFIG_USER_PARMS;             

static const uint16_t TOTAL_CONFIG_PARM_BYTESIZE = sizeof(CONFIG_SYSTEM_PARMS) + sizeof(CONFIG_USER_PARMS);

typedef struct {
    const char              *sysparm_mnemonic;
    CONFIG_PARM_DATA_TYPES  sysparm_data_type;
    void                    *sysparm_data_ptr;
} CONFIG_PARM_LOOKUP_TABLE;    

// ****************************************

static LT_LOGGER_DATA  gateway_log_data;
static CONFIG_SYSTEM_PARMS *config_sys_parms_ptr = &gateway_log_data.config_system_parms;

// **************************************************
// Lookup table for the System Parms
// 
// CAA: This is a stinking mess - There is no easy way to define &gateway_log_data.config_system_parms
// outside of the following initialization, so the result is more verbose than it should be
static const CONFIG_PARM_LOOKUP_TABLE config_parm_lookup_table[] = {
    { SYS_PARM_MOBILE_GATEWAY_MNEM,     SYS_PARM_MOBILE_GATEWAY_TYPE,   &config_sys_parms_ptr->mobile_gateway},
    { SYS_PARM_GATEWAY_NUMBER_MNEM,     SYS_PARM_GATEWAY_NUMBER_TYPE,   &gateway_log_data.config_system_parms.gw_ordinal_number},

    // FILLER to mark end of list
    { "",                               0,                              NULL} 
};

Вопрос заключается в следующем: почему я получаю сообщение об ошибке: элемент инициализатора не является константой (рядом с инициализацией для 'config_parm_lookup_table[0].sysparm_data_ptr'), когда инициализатор для config_parm_lookup_table[1].sysparm_data_ptr эффективно использует ту же конструкцию?

Очевидно, у меня есть обходной путь, но он кажется многословным.

0 ответов

Другие вопросы по тегам