2016-11-22 2 views
0

Каков наилучший способ инициализации массива const внутри структуры в C?Инициализация массива const внутри структуры в C?

typedef struct 
{ 
    float coefs[5]; 

} t_data; 

const float ONETWOTHREEFOURFIVE[5] = {1,2,3,4,5}; 

void init(t_data* data) 
{ 
    data->coefs[0] = ONETWOTHREEFOURFIVE[0]; 
    data->coefs[1] = ONETWOTHREEFOURFIVE[1]; 
    ... 
} 

В реальном мире у меня есть более 5 элементов.

Есть ли лучший способ?

+1

Используйте цикл 'for' или' memcpy'. – user3386109

+1

«... инициализация массива const внутри структуры в C» - инициализированный целевой массив не является константой; * источник * есть. – WhozCraig

ответ

1

Вы имеете в виду инициализацию массива non-const внутри структуры, правильно?

Я думаю, что вы хотите:

memcpy(data->coefs, ONETWOTHREEFOURFIVE, sizeof(ONETWOTHREEFOURFIVE)); 
-1

Если вы можете присвоить всю структуру сразу, можно создать фиктивный структуры и использовать назначение:

t_data const ONETWOTHREEFOURFIVE = { {1, 2, 3, 4, 5 } }; 

void init(t_data* data) { 
    *data = ONETWOTHREEFOURFIVE; 
4

Предполагая, что вы будете уверены, что размеры будут быть тем же, вы можете использовать memcpy. Я бы также локализовать источник данных, а поэтому он не загрязняет объем ненужно:

void init (t_data* data) { 
    static const float srcData[] = {1,2,3,4,5}; 
    assert (sizeof(data->coeffs) == sizeof(srcData)); 
    memcpy (data->coeffs, srcData, sizeof(data->coeffs)); 
} 

Вы отметите у меня есть в там assert, это позволит обнаружить рано ли вы строите код, который vioaltes предположение, что два массива одного размера. Это позволит избежать переполнения буфера при чтении или записи.

+0

Спасибо за масштабность. – Danijel

+1

Вы можете даже утверждать, что время компиляции assert: 'int comp_assert [sizeof (data-> coeffs) == sizeof (srcData)? 1: -1]; ' – selbie

+0

@selbie +1 для компиляции time assert, но я бы использовал' static_assert' из стандартной библиотеки, если он доступен. – user694733

0

Мои два цента. Предполагая, что ваш t_data может содержать больше материалов, чем просто набор коэффициентов, вы можете использовать выделенную структуру держателя и избегать любого цикла или memcpy().

typedef struct { 
    float c[5]; 
} coef_holder; 

static const coef_holder init_set = { 
    { 1, 2, 3, 4, 5 } 
}; 

typedef struct 
{ 
    coef_holder coefs; 
    /* more stuff */ 
} t_data; 

void init(t_data* data) 
{ 
    data->coefs = init_set; 
    ... 
} 

Также обратите внимание, что эта строка:

data->coefs = init_set; 

не является инициализация, это назначение. Конечно, на некоторых архитектурах это назначение может быть переведено в memcpy(), но в любом случае исходный код выглядит более понятным.

Смежные вопросы