[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3884932#p3884932"]Да можно,но:
1)вместо if (x<=10) придется писать if ((x>=2)&&(x<=(10+2)))
2 условия вместо одного - код станет длиннее
2)вместо у[х] = а; придется писать у[х - 2] = а;
3)имхо код не станет понятней[/uquote]
У меня нет компилятора для AVR, тем более CodeVision, но запускаю в Compiler Explorer простенький пример для AVR GCC 9.2.0:
Код: Выделить всё
constexpr unsigned char x = -1;
static_assert(x == -1);
И получаю ошибку компиляции, потому то при сравнении все приводится к int и получаем (0xFF == 0xFFFF), а на STM32 int 32-х битный, там вместо -1 подставит 0xFFFFFFFF. Ну ладно, собираю тестовый пример с твоим кодом, уже для STM32:
Спойлер
Код: Выделить всё
static char str[] = "IF12GIF01234567895I";
static char y[10];
bool done = false;
uint8_t x = -2;
for (char* p = str; *p; p++)
{
char a = *p;
if (x <= 10)
{
if (a >= '0' && a <= '9')
{
y[x] = a;
if (x < 10)
{
x++;
}
else
{
x = -2;
done = true;
break;
}
}
else x = -2;
}
if (x == (uint8_t)-1)
{
if (a == 'F') x++;
else x = -2;
}
if (x == (uint8_t)-2)
{
if (a == 'I') x++;
}
}
rtt.printf<"{}, {}\n">(done, y); // true, 01234567895
Добавил break и пару приведений к uint8_t, чтобы вообще работало, но в развернутом виде код уже не выглядит таким компактным, как изначально... Теперь пишу свою реализацию:
Спойлер
Код: Выделить всё
static char str[] = "IF12GIF01234567895I";
static char y[10];
bool done = false;
uint8_t x = 0;
for(char* p = str; *p; p++)
{
char a = *p;
if (x == 0)
{
if (a == 'I') x = 1;
}
else if (x == 1)
{
x = (a == 'F') ? 2 : 0;
}
else
{
if(a >= '0' && a <= '9')
{
y[x - 2] = a;
if (x++ == 12)
{
done = true;
x = 0;
break;
}
}
else x = 0;
}
}
cout.printf<"{}, {}\n">(done, y);
Начальное состояние нулевое, никаких дополнительных условий не появилось, нет приведений и для -Os размеры двум бинарников абсолютно одинаковые.
ps. В настройках CodeVision есть "Promote char to int", который по умолчанию еще и вроде выключен, видимо потому код со сравнением (x == -1) и работает...