Мой компилятор оптимизирует что-то, что не должно - PullRequest
1 голос
/ 04 декабря 2010

Мой компилятор, MPLAB C30 (GCC v3.23), не компилирует этот код:

 if(font_info.flags & FONT_LOWERCASE_ONLY)
  ch = tolower(ch);
 if(font_info.flags & FONT_UPPERCASE_ONLY)
  ch = toupper(ch);

Он не производит вывод сборки (как-то оптимизирует его), и я не могу понять, почему.

Я все правильно определил, насколько я вижу:

#define FONT_LOWERCASE_ONLY  1
#define FONT_UPPERCASE_ONLY  2

struct FontEntry
{
 int id;
 unsigned char width, height;
 const char *name;
 const char *lookup;
 const char *data;
 int flags;
};

struct FontEntry fonts[NUM_FONTS + 1] = {
 { 0, 8, 14, "Outlined8x14", &font_lookup_outlined8x14, &font_data_outlined8x14, 0 },
 { 1, 8, 8, "Outlined8x8", &font_lookup_outlined8x8, &font_data_outlined8x8, FONT_UPPERCASE_ONLY }, 
 { 2, 8, 8, "Tiny5x5", 0, 0, 0 }, // not yet implemented
 { -1 } // ends font table
};

Я использую функцию:

void write_char(char ch, unsigned int x, unsigned int y, int flags, int font)
{
 int i, yy, addr_temp, row, row_temp, xshift;
 uint16_t and_mask, or_mask, level_bits;
 struct FontEntry font_info;
 char lookup;
 fetch_font_info(ch, font, &font_info, &lookup);
    // ...
}

Определение fetch_font_info:

int fetch_font_info(char ch, int font, struct FontEntry *font_info, char *lookup)
{
 // First locate the font struct.
 if(font > SIZEOF_ARRAY(fonts))
  return 0; // font does not exist, exit.
 // Load the font info; IDs are always sequential.
 *font_info = fonts[font];
 // Locate character in font lookup table. (If required.)
 if(lookup != NULL)
 {
  *lookup = font_info->lookup[ch];
  if(lookup == 0xff)
   return 0; // character doesn't exist, don't bother writing it.
 }
 return 1;
}

Что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 04 декабря 2010

Поскольку FONT_LOWERCASE_ONLY и FONT_UPPERCASE_ONLY не равны 0, то font_info.flags всегда должен быть 0 (или не иметь никаких 1 в младших двух битах). Компиляторы могут быть умными в том, как они оценивают «константы», даже если вы не определяете их как таковые.

Я вижу, что ваш массив шрифтов имеет несколько нулей в разделе флагов, поэтому я уверен, что у вас есть жестко запрограммированная ссылка на одну из этих записей во время компиляции.

0 голосов
/ 04 декабря 2010

Возможно ли, что вы действуете по коду возврата из fetch_font_info() в write_char() (трудно понять, так как отправленный вами write_char() - это не то, что вы на самом деле компилируете; произошло некоторое редактирование)?

Если вы действуете с возвратом из fetch_font_info(), проблема может быть связана с ошибкой в ​​тестировании символа, на который указывает lookup:

if(lookup == 0xff) 

быть

if(*lookup == 0xff)

с ошибочным тестом, fetch_font_info() всегда будет возвращать 0, если поиск не нулевой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...