2016-03-11 4 views
-1

Как определить и использовать динамически выделенный массив, членами которого являются static const?Динамически выделенный массив со статическими константными членами

Предыстория: Мне нужно сделать выше, чтобы сохранить несколько транзакций, которые запрашиваются во время выполнения. Ниже описана процедура snipet, как определить транзакцию. В этом коде используется SDK Nordic Semiicondictor nRF5x.

static app_twi_transfer_t const transfers[] = 
{ 
    APP_TWI_WRITE(MMA7660_ADDR, p_reg_addr, 1, APP_TWI_NO_STOP), 
    APP_TWI_READ (MMA7660_ADDR, p_buffer, byte_cnt, 0) 
}; 

static app_twi_transaction_t const transaction = 
{ 
    .callback   = read_mma7660_registers_cb, 
    .p_user_data   = NULL, 
    .p_transfers   = transfers, 
    .number_of_transfers = sizeof(transfers)/sizeof(transfers[0]) 
}; 

APP_ERROR_CHECK(app_twi_schedule(&m_app_twi, &transaction)); 
+0

Там не 'статические члены const' в вашем посте, ни в' app_twi_transaction_t' структуры. – LPs

+0

В сообщении нет динамически выделенного массива! –

+0

@LPs Что такое 'static app_twi_transaction_t const transaction'? – AmiguelS

ответ

2

Как можно определить и использовать динамически выделенный массив, члены которого являются статическими Const?

Вы не можете. Члены массива обязательно имеют тот же класс хранения и связь, что и сам массив, поэтому динамически выделенный массив не может содержать статические элементы. Однако такой массив может содержать копий или указателей на объекты со статическим классом хранения и/или связью.

1

Вы не можете статически инициализировать члены динамически выделяемый массива: только два варианта, поставляемые в стандартной библиотеке неинициализированным, т.е. malloc и нулевой инициализируется, т.е. calloc.

Если вы хотите инициализировать элементы своего массива чем-либо еще, вам нужно выполнить задания самостоятельно. C позволяет напрямую назначать struct s, поэтому инициализация массива struct s не сильно отличается от инициализации массива примитивов.

Вот небольшой пример:

// This is your struct type 
typedef struct { 
    int a; 
    int b; 
    int c; 
} test_t; 
// This is some statically initialized data 
test_t data[] = { 
    {.a=1, .b=2, .c=3} 
, {.a=10, .b=20, .c=30} 
, {.a=100, .b=200, .c=300} 
}; 
int main(void) { 
    // Allocate two test_t structs 
    test_t *d = malloc(sizeof(test_t)*2); 
    // Copy some data into them: 
    d[0] = data[1]; 
    d[1] = data[2]; 
    // Make sure that all the data gets copied 
    printf("%d %d %d\n", d[0].a, d[0].b, d[0].c); 
    printf("%d %d %d\n", d[1].a, d[1].b, d[1].c); 
    free(d); 
    return 0; 
} 

То, что выглядит как обычные задания выше, например, d[0] = data[1], выполняет копирование содержимого статически инициализированного в динамически инициализированный d[0].

Demo.