Обсуждаем контроллеры компании Atmel.
Ответить

avr-gcc проблема с scanf()

Пт май 04, 2018 12:37:03

добрый день

вопрос применительно к 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

Re: avr-gcc проблема с scanf()

Пт май 04, 2018 15:26:38

Код:
// scanf  ("%u%*c%u",&A,&B);
// scanf  ("%u% %u",&A,&B);
// scanf  ("%u%,%u",&A,&B);

1) Полей для конверсии 3 а параметров для присвоения 2. "Третий адрес" для присвоения скорее всего возьмётся выше по стеку и куда там по нему полетит - :o
2) Не уверен, что спецификаторы "запятая", "пробел" и "звёздочка" существуют. Если речь о наборе символов (АКА set) то %*[,] %*[ ] %*[*] соответственно и без присвоения.
3) Гоцаца вроде как умеет валидность масок printf/scanf проверять и предупреждения выдавать - у вас как - молчит?
4) Если разделитель ввода всегда whitespace - простого "%u%u" должно хватить.

Re: avr-gcc проблема с scanf()

Пт май 04, 2018 15:41:44

проблемы начинаются, когда надо принять два числа:


scanf-ом пользуюсь только когда надо "для себя, по-быстрому (для теста)", да и то часто бывает проще что-то другое использовать...
А так:
1) Для формата %u, надо передавать адрес на область размером не менее sizeof (int). У Вас передается адрес на однобайтовую переменную -> что там scanf попортит, только компилятору с линкером известно. Так что я бы не был так уверен, что у Вас одна переменная считывается без проблем, просто Вы их (проблемы) не видите.
2) Странно Вы как то передаете форматную строку и вводите данные. Смотреть по исходникам, как это будет работать желания особого нет - но, если Вам интересно, можете посмотреть.

Re: avr-gcc проблема с scanf()

Пт май 04, 2018 17:15:46

1) Для формата %u, надо передавать адрес на область размером не менее sizeof (int). У Вас передается адрес на однобайтовую переменную -> что там scanf попортит, только компилятору с линкером известно.

Ну если канонический c-decl предположить - то адреса передаём на стеке функции - вот его и распишет. И если платформа LE - то (при корректной строке разбора) пациент ничего и не заметит - оба параметра вы́читать будет можно - главное, чтобы до адреса возврата из функции ещё какая переменная scanf-у под раздачу подвернулась (DEV, SIG?). :-)

Re: avr-gcc проблема с scanf()

Пт май 04, 2018 19:04:57

спасибо, муррр!

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