Автор: sunjob May 4 2018, 10:05
avr-gcc проблема с scanf()
добрый день
вопрос применительно к avr-gcc/atmel-toolchain
код проверялся и пытался по всякому ... (ни шмагли никак :о)
принять одно число для scanf() - не проблема
проблемы начинаются, когда надо принять два числа:
- не принимает "оба" числа, либо если принимает (первый пример), то "первое" число = 0
- при "неправильном" типе - уходит в зацикливание
судя по скудным высказываниям по поводу scanf() - для avr-gcc это "нормальное поведение" и "все на это уже давно забили"
высказываемся, можно с кодом/примерами, можно просто "ключевые слова" или пофилософствовать...
спасибо
Код
uint8_t A,B;
while(1)
{
DEV = -1, SIG = -1;
scanf ("%u%,%u",&A,&B);
printf ("A='%u', B='%u' \n",A,B);
}
выхлоп
//
// scanf ("%u%*c%u",&A,&B);
// input: '1+2'
//
A='0', B='2'
//
// scanf ("%u% %u",&A,&B);
// input: '1 2'
//
A='1', B='65535'
A='2', B='65535'
//
// scanf ("%u%,%u",&A,&B);
// input "1,2"
//
A='1', B='65535'
A='65535', B='65535'
A='65535', B='65535'
... loop ... зацикливание ...
- avr-gcc-4.9.2 / atmel-toolchain 3.4.2 and 3.5.4 / linux
- avr-studio-4.19 / win_xp
- variation with key-library (-Wl,-u,vfprintf -lprintf_min, -Wl,-u,vfprintf -lprintf_flt, -Wl,-u,vfscanf -lscanf_min, -Wl,-u,vfscanf -lscanf_flt...)
- build witn makefile & shell-script
Автор: megajohn May 4 2018, 10:47
Цитата(sunjob @ May 4 2018, 14:05)
scanf ("%u%,%u",&A,&B);
пишите scanf ("%u
%%,%u",&A,&B);
Автор: Serge V Iz May 4 2018, 13:16
Цитата(sunjob @ May 4 2018, 11:05)
[code]uint8_t A,B;
...
scanf ("%u%,%u",&A,&B);
...
вообще, тут, видимо, не стоит рассчитывать на нормальное поведение )
что скажет следующая строчка:
CODE
printf("%u %u %u", sizeof(unsigned), (unsigned)&A, (unsigned)&B);
?
Автор: sunjob May 4 2018, 16:41
спасибо
я по невнимательности вставил код, которым "уже всяко-разно" понаэкспериментировал ... (он естественно весь испахабленный)
невнимательность плюс желание сэкономить (использовать 8бит), умные люди помогли
рабочий код
Код
uint8_t A,B;
while(1)
{
A = -1, B = -1;
scanf ("%hhu%hhu",&A,&B);
printf ("A='%u', B='%u'\n", A,B);
//
// or
//
scanf ("%" SCNu8 "%" SCNu8 , &A,&B);
printf ("A='%" PRIu8 "', B='%" PRIu8 "'\n", A,B);
}