LINUX.ORG.RU

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

 , , ,


0

1

добрый день

вопрос применительно к avr-gcc/atmel-toolchain

код проверялся и пытался по всякому ... (ни шмагли никак :о)

принять одно число для scanf() - не проблема

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

- не принимает «оба» числа, либо если принимает (первый пример), то «первое» число = 0

- при «неправильном» типе - уходит в зацикливание

судя по скудным высказываниям по поводу scanf() - для avr-gcc это «нормальное поведение» и «все на это уже давно забили»

высказываемся, можно с кодом/примерами, можно просто «ключевые слова» или пофилософствовать...

спасибо

int8_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

★★★★

Последнее исправление: sunjob (всего исправлений: 2)

Ну так то int8_t требует %hhu. Но не знаю, насколько на avr это так.

В int8_t не влезет 65535. Наверно все же требуется uint16_t и %hu.

deadskif
()
Ответ на: комментарий от deadskif

да не... :о)

этот анахронизм остался от кекспериментов, с типами тоже по всякому пробовал ...

да и скану какая разница, он принимает число, другое дело, как он его «там у себя в голове» интерпритирует... ну покажет максимально-возможное, вместо отрицательного...

ну т.е. пробовал с типами экспериментировать, не помогло...

sunjob ★★★★
() автор топика
Последнее исправление: sunjob (всего исправлений: 2)

Если я правильно понимаю, то «%u» ожидает uint32_t, а аргументы у вас int8_t?

Какой будет выхлоп у этого кода?

printf("int8_t size %u\n", (uint32_t)sizeof(int8_t));
printf("uint32_t size %u\n", (uint32_t)sizeof(uint32_t));

andreyu ★★★★★
()
Ответ на: да не... :о) от sunjob

Вообще должно быть

uint32_t a,b;
char c;
scanf("%u%c%u", &a, &c, &b);
'%,' '% ' '%*c' это не то, на сколько я понимаю, чего вы хотите.

deadskif
()
Последнее исправление: deadskif (всего исправлений: 1)
Ответ на: комментарий от deadskif

Вообще я не знаю системы где бы SCNd8 был бы не равен hhd, но например для fast типов есть системы где

SCNdFAST8 = hhd

а есть где

SCNdFAST8 = d

https://sourceforge.net/p/mingw/mingw-org-wsl/ci/b6761db45b70f7def58ec5518657...

ftp://ftp.jaist.ac.jp/pub/NetBSD/misc/joerg/XEN3DOMU/src/src/sys/arch/amd64/i...

fsb4000 ★★★★★
()

СПАСИБО

я по невнимательности вставил код, которым «уже всяко-разно» понаэкспериментировал ...:) (он естественно весь испахабленный)

невнимательность плюс желание сэкономить (использовать 8бит), умные люди помогли

рабочий код

uint8_t A,B;

while(1)
  {
  A = -1, B = -1;
  scanf  ("%hhu%hhu",&A,&B); 
  printf ("A='%u', B='%u'\n", A,B);
  }
sunjob ★★★★
() автор топика
Последнее исправление: sunjob (всего исправлений: 1)
Ответ на: СПАСИБО от sunjob

Эх, видимо невнимательно ты прочитал коменты :(

hhu - спецификатор для unsigned char

SCNu8 и PRIu8 - спецификаторы для uint8_t

uint8_t A,B;

while(1)
  {
  A = -1, B = -1;
  scanf ("%" SCNu8 "%" SCNu8 , &A,&B);
  printf ("A='%" PRIu8 "', B='%" PRIu8 "'\n", A,B);
  }
fsb4000 ★★★★★
()
Ответ на: комментарий от fsb4000

невнимательно, а то!

по поводу вашего кода, не понятно, что он показывает? если - работоспособность, то и мой последний тоже работает

как я размышлял (надеюсь, поправите, если не прав)

uint8_t - по размерности тоже что и char отсюда и модификактор (не вижу криминала + посоветовали более знающие люди :о) я так пораздумывал и ... нехотя согласился :о)

hhu - спецификатор для unsigned char

хотелось бы разобраться детально

соглашусь, «ваши» более логичные и красивые

scanf ("%" SCNu8 "%" SCNu8 , &A,&B);
printf ("A='%" PRIu8 "', B='%" PRIu8 "'\n", A,B);

спасибо

sunjob ★★★★
() автор топика
Последнее исправление: sunjob (всего исправлений: 3)
Ответ на: комментарий от sunjob

хотелось бы разобраться детально

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf

страница 329:

The length modifiers and their meanings are:

hh Specifies that a following d,i,o,u,x,or X conversion specifier
applies to a signed char or unsigned char argument  (the  
argument  will  have been  promoted  according  to  the  integer  
promotions,  but  its  value  shall  be converted to signed char
or unsigned char before printing); or that a following n 
conversion specifier applies to a pointer to a signed char
argument.

страница 235:

Macros for format specifiers

Each of the following object-like macros expands to a character
string literal containing a conversion  specifier, possibly  
modified  by  a  length  modifier, suitable  for  use  within  
the format argument of a formatted input/output function when 
converting the corresponding integer type.  These macro names 
have the general form of PRI (character string literals for  the
fprintf and fwprintf family)  or SCN (character  string  literals  
for  the fscanf and fwscanf family), followed by the conversion 
specifier, followed by a name  corresponding  to  a  similar  
type  name  in  7.20.1.  In  these  names, N represents  the
width  of  the  type  as  described  in  7.20.1.  For example,
PRIdFAST32 can  be  used  in  a format string to print the value 
of an integer of type int_fast32_t.

fsb4000 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.