Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Интересно поведение на GCC
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=16845
Страница 1 от 3

Автор:  Nikola Kirov [ Пет Ное 01, 2019 11:17 pm ]
Заглавие:  Интересно поведение на GCC

Код:
void sys_rise_active_warning(ut warning)
{
   if (sys.active_warnings & (1<<warning))
      return
   sb16_sec((void*)&sys.active_warnings, warning);
   communication_SendPeriodicStatus();
}


Това се компилира но разбира се не работи според очакванията.
След return съм забравил ;
sb16_sec се изпълнява ако условието е изпълнено :)

Автор:  iss [ Пет Ное 01, 2019 11:28 pm ]
Заглавие:  Re: Интересно поведение на GCC

GCC-то би трябвало да се държи точно по правилния начин,
защото това което компилира е всъщност:
Код:
void sys_rise_active_warning(ut warning)
{
   if (sys.active_warnings & (1<<warning))
   {
      return sb16_sec((void*)&sys.active_warnings, warning);
   }
   communication_SendPeriodicStatus();
}

нали ? :) По принцип би трябвало да се оплаче поне с warning, че void ф-ция се напъва да връща нещо....

Автор:  ps66 [ Съб Ное 02, 2019 12:46 am ]
Заглавие:  Re: Интересно поведение на GCC

ako sb16_sec e void, е напълно коретно!

Автор:  Nikola Kirov [ Съб Ное 02, 2019 9:11 am ]
Заглавие:  Re: Интересно поведение на GCC

Коректно е уж ама и аз си мисля че едно предупреждения че void функцията иска да връща нещо нямаше да е излишно :)
Постнах го щото е интересно. Не се бях сблъсквал.

Автор:  ДедоБоре [ Съб Ное 02, 2019 9:17 am ]
Заглавие:  Re: Интересно поведение на GCC

това с какъв уорнинг левъл минава?

Код:
void f() {}
int t() {
return f();
}

clang 6.0.0:
t2.c:3:8: error: returning 'void' from a function with incompatible result type 'int'
return f();
       ^~~
1 error generated.

gcc 6.4.0:
t2.c: In function 't':
t2.c:3:8: error: void value not ignored as it ought to be
return f();
        ^~~



ако функцията t() e void всичко е наред и няма причина компилатора да мръцне. генерира се просто връщане (ала RTS). демек return (void) f() не се различава по нищо от чист return
Код:
Disassembly of section .text:

0000000000000000 <f>:
   0:   55                      push   %rbp
   1:   48 89 e5                mov    %rsp,%rbp
   4:   5d                      pop    %rbp
   5:   c3                      retq
   6:   66 2e 0f 1f 84 00 00    nopw   %cs:0x0(%rax,%rax,1)
   d:   00 00 00

0000000000000010 <t>:
  10:   55                      push   %rbp
  11:   48 89 e5                mov    %rsp,%rbp
  14:   e8 e7 ff ff ff          callq  0 <f>
  19:   5d                      pop    %rbp
  1a:   c3                      retq

Автор:  Nikola Kirov [ Съб Ное 02, 2019 3:56 pm ]
Заглавие:  Re: Интересно поведение на GCC

Различава се с това че вика функцията :)

Автор:  ДедоБоре [ Съб Ное 02, 2019 4:44 pm ]
Заглавие:  Re: Интересно поведение на GCC

е, да. така е.
затова е добра практика винаги да си ограждаш иф-овете (примерно) с {}, независимо, че е само един ред след иф-а. така компилатора ще ти ревне, ако си забравил ';'

отродоксалните правоверни в kernel.org обаче не го харесват това и са го деприкейтнали.

та в тоя контекст, компилатора не се държи странно. прави точно това, което си написал :D

Автор:  slav4o.com [ Съб Ное 02, 2019 9:51 pm ]
Заглавие:  Re: Интересно поведение на GCC

Карам едни курсове за програмиране и там също препоръчаха винаги да има {} .
Обаче на мен лично ми е много по-удобно ако има един стейтмънт, да го пиша без тях. Малко по-прегледно като, че ли. А и ако има последователно много вложени if-ове става луда работа да се слагат {} на всеки следващ if. :-s
Код:
if(command[0] == 'T')
   if(command[1] == 'E')
      if(command[2] == 'S')
         if(command[3] == 'T'){
             AlaBala();
             DyraByra();
             StoChadyra();
         }

не, че няма по-културен начин за тая проверка...

Автор:  Jack [ Пет Ное 08, 2019 10:03 pm ]
Заглавие:  Re: Интересно поведение на GCC

На времето (първата и единствена книжка по дискретна математика която съм чел - по Шанън, Флег и компания от 80-те) беше към 100-150 странички(много добро четиво разбираемо дори за математически инвалид като мен). И така- тука преди две седмици реших да хвърля едно око на нещо по-съвременно, та белким да си разчупя и аз малко 'парадигмите'. 'Книжлето' на което попаднах е къде 600-700 страници и за две седмици, с буксуване и припълзяване, стигнах докъм 100-тната - в стил е: " Представете си един хотел с безкраен брой стаи... Теоретично не може да бъде запълнен, но на момента ви пристигат точно безкраен брой гости и го запълвате... След малко ви идва още един гост който няма къде да настаните и за това премествате всички гости с една стая на-горе, при което се освобождава стая 'номер 1' и го настанявате там... така всички гости са настанени и доволни... 8O ...ко речи? Не знам на каква дрога са били авторите, като са писали 'парадигмите' :evil: Или по-скоро аз съм кривия, щото кат гледам младеШта си ги разбира нещата, програмисТва си, професорсТва си по разни уни-та, даже престижни такива. Явно на мен не ми стига редбула в кръвта и твърде мноо съм излизал на вънка - ходил съм пеш, виждал съм разни предмети като дървета,хора, хотели - можИм да мислим до дадена степен в абстракция че хотела може и да е безкраен, но как така хем ще е краен, хем безкраен в един и същи момент -когато както ни оттърва. С две думи - всеки да си преценя сам до колко си е увредил мозъка от допир с реални предмети и хора :D , или пък 'парадигмите' на съвременните деца са и за него :? и той/тя владее 'Jedi Mind Tricks' за пред FAA.

ПС-по темата - то и около аритметичните оператори са желателни скоби, ма по съвременните стандарти не е 'cool' .
Виж ей тва е 'яко куул':
Код:
main(_){_^448&&main(-~_);putchar(--_%64?32|-~7[__TIME__-_/8%8][">'txiZ^(~z?"-48]>>";;;====~$::199"[_*2&8|_/64]/(_&2?1:8)%8&1:10);}

Автор:  ToHu [ Пет Ное 08, 2019 10:12 pm ]
Заглавие:  Re: Интересно поведение на GCC

Абе те ги учат уравнения с логика да решават .... сега гледам щерката в унито, верно че английския ми не е майчин, ама като гледам и на такива в които им е в кръвта до 10-то коляно пак не могат да разберат какво точно се пита в задачата камо ли как се решава, горе долу имаш две ябълки и три домата,колко тежи една планета ... някак си децата разбират, или налучкват какво се пита, и също така налучкват отговора, а може и дирекнто отговора да налучкват :)

Автор:  bobihot [ Пет Ное 08, 2019 11:14 pm ]
Заглавие:  Re: Интересно поведение на GCC

slav4o.com написа:
Карам едни курсове за програмиране и там също препоръчаха винаги да има {} .
Обаче на мен лично ми е много по-удобно ако има един стейтмънт, да го пиша без тях. Малко по-прегледно като, че ли. А и ако има последователно много вложени if-ове става луда работа да се слагат {} на всеки следващ if. :-s
Код:
if(command[0] == 'T')
   if(command[1] == 'E')
      if(command[2] == 'S')
         if(command[3] == 'T'){
             AlaBala();
             DyraByra();
             StoChadyra();
         }

не, че няма по-културен начин за тая проверка...

Aз харесвам леко слятото писане като твоето. Не
if(command[3] == 'T')
{
AlaBala();
}
else
{
DyraByra();
StoChadyra();
}

Автор:  ToHu [ Съб Ное 09, 2019 3:48 am ]
Заглавие:  Re: Интересно поведение на GCC

Ами слято е прегледно, стига да не му се обърка табулацията, иначе може да стане малък ужас, особенно някои по-сбити и съкратени записи, аз затова слагам {}, то не че пиша кой зане и какъв код ама ...

Автор:  TheWizard [ Съб Ное 09, 2019 3:54 pm ]
Заглавие:  Re: Интересно поведение на GCC

memcmp( command, "TEST", sizeof("TEST")-1 ) :roll:
http://www.cplusplus.com/reference/cstring/memcmp/

Автор:  slav4o.com [ Съб Ное 09, 2019 9:50 pm ]
Заглавие:  Re: Интересно поведение на GCC

Честно казано ако си я има табулацията, кода си се чете и без скобите.
Това кое къде е вложено може само по табулацията да се разбере, скобите ги слагам само поради изискване на стандарта. Някой виждал ли е компилатор който работи без скоби ?
TheWizard написа:
memcmp( command, "TEST", sizeof("TEST")-1 ) :roll:
http://www.cplusplus.com/reference/cstring/memcmp/

sizeof не връщаше ли размера в байтове на променливата. В случая подаваш (const char *)("TEST") ? Те. указател към null terminated string ? Размера на указателя зависи от операционната система или какъв процесор ползваш. Не беше ли нещо strlen :roll: това което трябва

Автор:  TheWizard [ Съб Ное 09, 2019 10:35 pm ]
Заглавие:  Re: Интересно поведение на GCC

sizeof е препроцес само - би трябва да върне 5 с нулата... или 4 :) ... нящо такова

Страница 1 от 3 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/