Эта функция C написана в плохой форме? - PullRequest
5 голосов
/ 04 декабря 2009
char byte_to_ascii(char value_to_convert, volatile char *converted_value) {

 if (value_to_convert < 10) {
  return (value_to_convert + 48);
 } else {
  char a = value_to_convert / 10;
  double x = fmod((double)value_to_convert, 10.0);
  char b = (char)x;
  a = a + 48;
  b = b + 48;
  *converted_value = a;
  *(converted_value+1) = b;
  return 0;
 }
}

Цель этой функции - взять значение без знака в диапазоне от 0 до 99 и вернуть либо его эквивалент ascii в случае 0-9, либо манипулировать небольшим глобальным массивом символов, на который можно ссылаться из вызывающего кода, следующего за функцией завершение.

Я задаю этот вопрос, потому что два компилятора от одного поставщика интерпретируют этот код по-разному.

Этот код был написан как способ разбить адресные байты, отправленные через RS485, в строки, которые можно легко передать в функцию send-lcd-string.

Этот код написан для архитектуры PIC18 (8-битный UC).

Проблема в том, что бесплатная / ознакомительная версия конкретного компилятора генерирует идеальный код сборки, который работает, хотя и страдает от снижения производительности, но платный и предположительно превосходный компилятор генерирует код более эффективно за счет возможности ссылаться на адреса всех мои байтовые массивы используются для управления графикой на моем ЖК-дисплее.

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

Спасибо.

Ответы [ 11 ]

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

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

Является ли ваше преобразованное_значение глобальным значением или иным образом назначено таким образом, что компилятор знает, что его нельзя трогать?

...