2013-06-13 3 views
2

Я использую GCC 4.7.2 (C99) и Atmel Studio 6 для проекта микроконтроллера.Как инициализировать массив ранее определенных массивов во время компиляции?

Я хочу определить серию одномерных массивов, а затем упорядочить их в различные двумерные массивы для предопределенных последовательностей.

Например:

unsigned char a1[2] = { 0b00000001, 0b00000010 }; 
unsigned char a2[2] = { 0b00000010, 0b00000010 }; 
unsigned char a3[2] = { 0b00000100, 0b00000010 }; 

unsigned char pattern1[1][2] = { a1, a2, a3 }; 

Однако это приводит к ошибке:

Initializer element is not computable at load time

Я могу настроить массив после компиляции -

unsigned char pattern1[1][2]; 

void setup_patterns() 
{ 
    pattern1[0] = a1; 
    pattern1[1] = a2; 
    pattern1[2] = a3; 
} 

Но было бы гораздо проще иметь возможность предоставлять список с первым набором массивов, разделенных запятыми, учитывая, сколько их есть и сколько ns будет. (Пример, показанный здесь, очень упрощен.)

Я не очень опытен с программированием на С (я привык к C#). Есть ли способ назначить элементы двумерного массива, используя список определенных/названных одномерных массивов? (. Если во время компиляции или во время выполнения, это не имеет значения)

ответ

1

Попробуйте это:

unsigned char *pattern1[] = { a1, a2, a3 }; 

unsigned char pattern1[1][2] требует:

unsigned char pattern1[1][2] = { {1, 1} }; 

так что вы можете сделать ваш случай компиляции вложенными Инициализация массива:

unsigned char pattern1[3][2] = { 
    { 0b00000001, 0b00000010 }, 
    { 0b00000010, 0b00000010 }, 
    { 0b00000100, 0b00000010 }, 
}; 
+0

Первый пример, кажется, работает безупречно. Я не хочу переопределять все 'char' для каждого шаблона, как в вашем последнем примере, это было бы серьезным делом. – JYelton

+0

Право, я просто хотел дать понять, почему вы получили эту ошибку – perreal

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