Как инициализировать массив с помощью прекомпилятора на языке программирования C - PullRequest
0 голосов
/ 04 ноября 2010

Я хочу инициализировать массив.Но у меня есть два разных начальных значения во время компиляции.Поэтому я хочу сделать это во время предварительной компиляции.Мой код

static const U8 userFont[8][8] =
{   
#if (LCD_LANGUAGE == LANG_1)
    { 0x0E, 0x09, 0x09, 0x1D, 0x09, 0x09, 0x0E, 0x00 }, 
    { 0x03, 0x0E, 0x11, 0x10, 0x10, 0x11, 0x0E, 0x00 }, 
    { 0x09, 0x06, 0x0F, 0x01, 0x02, 0x04, 0x0F, 0x00 }, 
    { 0x0E, 0x11, 0x10, 0x10, 0x15, 0x0E, 0x04, 0x00 }, 
    { 0x11, 0x0E, 0x11, 0x10, 0x10, 0x11, 0x0E, 0x00 }, 
    { 0x19, 0x06, 0x09, 0x04, 0x02, 0x09, 0x06, 0x00 }, 
    { 0x00, 0x01, 0x01, 0x01, 0x01, 0x03, 0x03, 0x03 },     
    { 0x03, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01 }      
#elif (LCD_LANGUAGE == LANG_2)
    { 0x0A, 0x00, 0x11, 0x11, 0x11, 0x11, 0x0E, 0x00 },     
    { 0x04, 0x00, 0x1E, 0x04, 0x04, 0x04, 0x1E, 0x00 },     
    { 0x0A, 0x00, 0x0E, 0x11, 0x11, 0x11, 0x0E, 0x00 },     
    { 0x0E, 0x11, 0x10, 0x10, 0x11, 0x0E, 0x04, 0x00 },     
    { 0x0F, 0x10, 0x10, 0x0E, 0x01, 0x1E, 0x04, 0x00 },     
    { 0x0E, 0x00, 0x0F, 0x10, 0x17, 0x11, 0x0F, 0x00 },     
    { 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x03, 0x03 },     
    { 0x03, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01 }  

#endif
};

Но я получаю эту ошибку: «ожидал выражения».Ошибка в конце массива.Так как я могу решить эту проблему?

Ответы [ 2 ]

2 голосов
/ 04 ноября 2010

Пара вопросов:

  1. Вы определили тип U8 с чем-то вроде typedef unsigned char U8;?
  2. Вы определили LCD_LANGUAGE как LANG_1 или LANG_2?

Причина, по которой я спрашиваю, заключается в том, что этот небольшой фрагмент ниже компилируется и работает просто отлично:

#include <stdio.h>
typedef unsigned char U8;
#define LCD_LANGUAGE LANG_1
static const U8 userFont[8][8] =
{
#if (LCD_LANGUAGE == LANG_1)
    { 0x0E, 0x09, 0x09, 0x1D, 0x09, 0x09, 0x0E, 0x00 },
    { 0x03, 0x0E, 0x11, 0x10, 0x10, 0x11, 0x0E, 0x00 },
    { 0x09, 0x06, 0x0F, 0x01, 0x02, 0x04, 0x0F, 0x00 },
    { 0x0E, 0x11, 0x10, 0x10, 0x15, 0x0E, 0x04, 0x00 },
    { 0x11, 0x0E, 0x11, 0x10, 0x10, 0x11, 0x0E, 0x00 },
    { 0x19, 0x06, 0x09, 0x04, 0x02, 0x09, 0x06, 0x00 },
    { 0x00, 0x01, 0x01, 0x01, 0x01, 0x03, 0x03, 0x03 },
    { 0x03, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01 }
#elif (LCD_LANGUAGE == LANG_2)
    { 0x0A, 0x00, 0x11, 0x11, 0x11, 0x11, 0x0E, 0x00 },
    { 0x04, 0x00, 0x1E, 0x04, 0x04, 0x04, 0x1E, 0x00 },
    { 0x0A, 0x00, 0x0E, 0x11, 0x11, 0x11, 0x0E, 0x00 },
    { 0x0E, 0x11, 0x10, 0x10, 0x11, 0x0E, 0x04, 0x00 },
    { 0x0F, 0x10, 0x10, 0x0E, 0x01, 0x1E, 0x04, 0x00 },
    { 0x0E, 0x00, 0x0F, 0x10, 0x17, 0x11, 0x0F, 0x00 },
    { 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x03, 0x03 },
    { 0x03, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01 }
#endif
};
int main (void) {
    printf ("0x%02x 0x%02x\n", userFont[0][0], userFont[2][2]);
    return 0;
}

производство:

0x0e 0x0f
1 голос
/ 04 ноября 2010

LANG_1 AND LANG_2 - enum, поэтому во время компиляции эти объекты недопустимы.Поэтому я заменяю их целочисленными значениями, и моя проблема решена.Спасибо.

...