Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум разработчиков электроники ELECTRONIX.ru _ Программирование _ avr-gcc проблема с scanf()

Автор: 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

спасибо

я по невнимательности вставил код, которым "уже всяко-разно" понаэкспериментировал ...sm.gif (он естественно весь испахабленный)
невнимательность плюс желание сэкономить (использовать 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);
  }

Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)