В настоящее время я работаю над системой мониторинга трафика, которая требует, чтобы геологические координаты (в виде поплавка) отправлялись в виде строки через модуль GSM/GPRS в виде текстового сообщения. Я использовал следующий код для преобразования этих значений с плавающей запятой в строки, но при компиляции появляется «предупреждение: (1393) возможное переполнение аппаратного стека; расчетная глубина стека: 10». Я использую PIC 16f877A, и что я могу сделать, чтобы избежать этого, кроме замены MCU?
void reverse(char *str, int len)
{
int i=0, j=len-1, temp;
while (i<j)
{
temp = str[i];
str[i] = str[j];
str[j] = temp;
i++; j--;
}
}
int intToStr(int x, char str[], int d)
{
int i = 0;
while (x)
{
str[i++] = (x%10) + '0';
x = x/10;
}
while (i < d)
str[i++] = '0';
reverse(str, i);
str[i] = '\0';
return i;
}
void ftoa(float n, char *res, int afterpoint)
{
int ipart = (int)n;
float fpart = n - (float)ipart;
int i = intToStr(ipart, res, 0);
if (afterpoint != 0)
{
res[i] = '.';
fpart = fpart * pow(10, afterpoint);
intToStr((int)fpart, res + i + 1, afterpoint);
}
}
pow
, что может быть ограничивающим фактором (если это библиотечная функция). В противном случае есть ли причина, по которой очень простая функцияreverse
не может быть частьюintToStr
? Это сэкономит 1 уровень стека. Но у вас нет глубины стека 10 в показанном коде: поэтому сделайте его более эффективным дальше. - person Weather Vane   schedule 27.03.2016