OberonCore https://forum.oberoncore.ru/ |
|
Очередной "прикол" от Си... https://forum.oberoncore.ru/viewtopic.php?f=26&t=678 |
Страница 1 из 2 |
Автор: | Wlad [ Пятница, 05 Октябрь, 2007 22:39 ] |
Заголовок сообщения: | Очередной "прикол" от Си... |
На сайте qnx.org.ru один из участников форума (по-моему, mike) описал как-то одну из ситуаций, когда начинают посещать сомнения в собственной вменяемости, при поиске ошибки в «очевидном» коде, в виде выражения: «Ну, думал, - ВСЁ! - ДОПРОГРАММИРОВАЛСЯ!...» Именно такой случай произошёл сегодня со мной. (И – что самое обидное – после обеда в пятницу! :о) ) Но, когда ошибка была найдена, в очередной раз появился повод поматюкаться в сторону Си и пожалеть об отсутствии оберонов под рукой для работы на AVR-ках... Сравните два фрагмента кода: Код: ... //------------------------------------------------------------------------------ case 2: if( KBD_key != KBD_prevKey ) KBD_state = 0; else if( KBD_wait-- == 0 ) { switch( KBD_key ) case KBD_KEY_BRIGHTNESS: Display_NextBrightnessLevel(); break; default: KBD_event = KBD_key; break; KBD_state = 99; } break; //------------------------------------------------------------------------------ ... и Код: ... //------------------------------------------------------------------------------ case 2: if( KBD_key != KBD_prevKey ) KBD_state = 0; else if( KBD_wait-- == 0 ) { switch( KBD_key ) { case KBD_KEY_BRIGHTNESS: Display_NextBrightnessLevel(); break; default: KBD_event = KBD_key; break; } KBD_state = 99; } break; //------------------------------------------------------------------------------ ... Не правда ли, отличия – ну прям-таки сразу бросаются в глаза!... :о) Этот код – часть «драйвера» клавиатуры в разрабатываемом мной устройстве (конечный автомат обработчика клавиатуры). Кусок switch( KBD_key ) был, первоначально, более объёмным. Но, после пересмотра требований и перепроектирования, я его упростил... Как выяснилось – себе на голову... :о) Текст я не набивал, а скопировал из ранней версии исходника. Скопировано было меньше case-частей. Вернее, я удалил в новом тексте, то, что оказалось ненужным... И, при этом, я случайно «грохнул» фигурные скобки в switch-конструкции. И КОМПИЛЯТОР ЭТО СПОКОЙНЕНЬКО ПРОПУСТИЛ! КАК – ТАК И НАДО! БЕЗ ВСЯКИХ НАРЕКАНИЙ! А я имел чудных несколько часов поисков «глюка»! (Прошу заметить, что отладка встроенных систем «несколько» разнится с отладкой в Дельфи или Визуал-студии... :о)))) ) Код на Си МОЖНО написать ОЧЕНЬ ёмким и кратким. Но, ребяты!, стоит это того времени, и тех нервов на отладке?! ОСОБЕННО в таких спартанских условиях, как в случае встроенных систем? (Можно, конечно, было и простым if-ом вместо switch-а обойтись, но я знаю, что требования будут меняться – потому и специально вставил «расширяемую» конструкцию... Решил облегчить себе жизнь. :о) ) |
Автор: | Geniepro [ Пятница, 05 Октябрь, 2007 23:03 ] |
Заголовок сообщения: | Re: Очередной "прикол" от Си... |
Ну, не знаю как Вам, а мне эта опечатка сразу в глаза бросилась, ещё до того, как увидел второй код. Кстати, такого у меня ещё не было... ;о) |
Автор: | Wlad [ Суббота, 06 Октябрь, 2007 07:50 ] |
Заголовок сообщения: | Re: Очередной "прикол" от Си... |
Geniepro писал(а): Ну, не знаю как Вам, а мне эта опечатка сразу в глаза бросилась, ещё до того, как увидел второй код. Это потому, что для публикации код "отблагородил"... Кроме того, все мы люди и всегда "лезем" проверять те места, которые "hарантированно работают" в самую последнюю очередь... Конечно код я этот "пробегал" глазами... Но дошёл до него уже после некотрого времени простановки контрольных точек в более высоких уровнях вызовов функций и обработки... Geniepro писал(а): Кстати, такого у меня ещё не было... ;о) Дарю! :о) |
Автор: | Darksnake [ Воскресенье, 07 Октябрь, 2007 13:30 ] |
Заголовок сообщения: | Re: Очередной "прикол" от Си... |
Меня вот например вот такие вещи Код: if( KBD_wait-- == 0 ) убивают сразу... Поэтому и не люблю я СИ... |
Автор: | Wlad [ Воскресенье, 07 Октябрь, 2007 14:45 ] |
Заголовок сообщения: | Re: Очередной "прикол" от Си... |
Darksnake писал(а): Меня вот например вот такие вещи Код: if( KBD_wait-- == 0 ) убивают сразу... Поэтому и не люблю я СИ... Сравните "на слух" фразы из разных языков: раннин' мэн бегущий человек людына, що бигае Какой язык вам больше "нравится"? :о) Почему? Вопрос не в том, что "нравится". А в том, что язык, постулировав поддержку структурных операторов, на поверку позволяет плевать на всю эту структурность! Не знаю, как вам, а у меня, кроме досады, ещё и масса удивления была (на уровне "ну, уж ЭТО - ни в какие ворота!...") |
Автор: | Александр Ильин [ Воскресенье, 07 Октябрь, 2007 17:57 ] |
Заголовок сообщения: | Re: Очередной "прикол" от Си... |
Недавно просматривал журнал "Хакер" за июль 2007-го. На странице 120 с интересом прочитал статью "Трюки от крыса", в которой описывались диграфы и триграфы языка Си. Для тех, кто не в курсе: триграфы - это трёхбуквенные, а диграфы - двухбуквенные эквиваленты некоторого символа. Например: (XX-граф) = (символ) ??= = # ??( = [ ??< = { <: = [ <% = { %: = # Эти комбинации (и некоторые другие) описаны в стандарте языка Си и, естественно, по-разному обрабатываются разными промышленными компиляторами. В статье указывалось, что при использовании диграфа <: совместно с шаблонами в Си++ возможна такая коллизия: std::vector<::X транслируется сначала в std::vector[:X, после чего компиляция завершается с ошибкой. В конце статьи автор пишет: "В действительности это не баг. Это фича! И теперь ты знаешь, как с ней обращаться". Остаётся только пожелать Си-программистам побольше таких фич и новых, интересных открытий каждый день. |
Автор: | Илья Ермаков [ Воскресенье, 07 Октябрь, 2007 18:59 ] |
Заголовок сообщения: | Re: Очередной "прикол" от Си... |
"Интересная болезнь маразм. Ничего не болит - зато каждый день новости" (С) Не я |
Автор: | Geniepro [ Воскресенье, 07 Октябрь, 2007 21:31 ] |
Заголовок сообщения: | Re: Очередной "прикол" от Си... |
Александр Ильин писал(а): В конце статьи автор пишет: "В действительности это не баг. Это фича! И теперь ты знаешь, как с ней обращаться". Остаётся только пожелать Си-программистам побольше таких фич и новых, интересных открытий каждый день. Да ну, эти Ваши диграфы - детский лепет... Вот то ли дело Хаскелл:Код: -------------------------------------------- Другое дело, что нормальные адекватные люди такое не делают...
module Main where{import List;import System; import Data.HashTable as H;(???????)=(concat );(??????)(???)(????)=((groupBy)(???)(????)) ;(??????????????????????)(????)=((?????????? )((tail).(???????))((????????????????????)(( ??????)(?????????????????????)(????))));(??) =([' ']);(??????????????)=((hashString));(?) =((>>=));(???????????????????????)([((???)), (????)])=((?????????????)(???))?(\(?????)->( (????????????????)(==)(??????????????))?(\(( ???))->((??????????????????)(??????????????? )(???)(?????))>>((?????????????????)(???))?( \((?????))->((((???????????????????)((????)) ((??????????????????????))((?????))))))));(( ???????????????????????))(??)=(????????????) ("usage f dic out");(?????????????????????)( (???),(??????))((????),(???????????????????? ))=((???)==(????));(?????????????????)(???)= (toList)(???);(????????????????????)(????)=( ((??????????)(((??????????)(snd)))((????)))) ;(??????????????????)(???????????????)(???)( (?????))=(((mapM)(((???????????????)(???)))( (lines)(?????))));(???????????????????)(???? )(???????????????????????)(?????)=(????????? )(????)((unlines)((???????????????????????)( ?????)));(????????????????)(???)((????))=((( new)(???)(????)));(main)=((???????????)?(((\ (???)->((???????????????????????)(???)))))); (???????????????)(???)(????)=((????????)(??? )((sort)(????))((??)++(????)));(???????????) =(getArgs);(????????????)(???)=((((print))(( ???))));(??????????)(???)(????)=(((map)(???) (????)));(????????)((???))(????)(?????)=(((( H.insert))((???))(????)(?????)));(?????????) ((???))((????))=(((writeFile)(???)((????)))) ;(?????????????)(???)=(((readFile)((???))))} -------------------------------------------- |
Автор: | Wlad [ Воскресенье, 07 Октябрь, 2007 22:11 ] |
Заголовок сообщения: | Re: Очередной "прикол" от Си... |
Илья Ермаков писал(а): "Интересная болезнь маразм. Ничего не болит - зато каждый день новости" (С) Не я Наверное, имелся в виду склероз... :о))))))))) |
Автор: | Wlad [ Воскресенье, 07 Октябрь, 2007 22:31 ] |
Заголовок сообщения: | Re: Очередной "прикол" от Си... |
Geniepro писал(а): ...Другое дело, что нормальные адекватные люди такое не делают... «Оранжевые штаны - два раза «ку!»»(с)Уэф из КДД Не пугайте меня...... :о) |
Автор: | batyrmastyr [ Пятница, 12 Октябрь, 2007 09:50 ] |
Заголовок сообщения: | Re: Очередной "прикол" от Си... |
Geniepro писал(а): Александр Ильин писал(а): В конце статьи автор пишет: "В действительности это не баг. Это фича! И теперь ты знаешь, как с ней обращаться". Остаётся только пожелать Си-программистам побольше таких фич и новых, интересных открытий каждый день. Да ну, эти Ваши диграфы - детский лепет... Вот то ли дело Хаскелл:...... Другое дело, что нормальные адекватные люди такое не делают... А что Хаскель? смотрим призеров http://www.ioccc.org (международный чемпионат по запутыванию Сишного кода)и в каких фирмах работают эти "нормальные адекватные люди". Как то раз попробовал поведение расшифровать -через сутки решил что хватит с меня таких извращений. Код: X=1024; Y=768; A=3;
J=0;K=-10;L=-7;M=1296;N=36;O=255;P=9;_=1<<15;E;S;C;D;F(b){E="1""111886:6:??AAF" "FHHMMOO55557799@@>>>BBBGGIIKK"[b]-64;C="C@=::C@@==@=:C@=:C@=:C5""31/513/5131/" "31/531/53"[b ]-64;S=b<22?9:0;D=2;}I(x,Y,X){Y?(X^=Y,X*X>x?(X^=Y):0, I (x,Y/2,X )):(E=X); }H(x){I(x, _,0);}p;q( c,x,y,z,k,l,m,a, b){F(c );x-=E*M ;y-=S*M ;z-=C*M ;b=x* x/M+ y*y/M+z *z/M-D*D *M;a=-x *k/M -y*l/M-z *m/M; p=((b=a*a/M- b)>=0?(I (b*M,_ ,0),b =E, a+(a>b ?-b:b)): -1.0);}Z;W;o (c,x,y, z,k,l, m,a){Z=! c? -1:Z;c <44?(q(c,x ,y,z,k, l,m,0,0 ),(p> 0&&c!= a&& (p<W ||Z<0) )?(W= p,Z=c): 0,o(c+ 1, x,y,z, k,l, m,a)):0 ;}Q;T; U;u;v;w ;n(e,f,g, h,i,j,d,a, b,V){o(0 ,e,f,g,h,i,j,a);d>0 &&Z>=0? (e+=h*W/M,f+=i*W/M,g+=j*W/M,F(Z),u=e-E*M,v=f-S*M,w=g-C*M,b=(-2*u-2*v+w) /3,H(u*u+v*v+w*w),b/=D,b*=b,b*=200,b/=(M*M),V=Z,E!=0?(u=-u*M/E,v=-v*M/E,w=-w*M/ E):0,E=(h*u+i*v+j*w)/M,h-=u*E/(M/2),i-=v*E/(M/2),j-=w*E/(M/2),n(e,f,g,h,i,j,d-1 ,Z,0,0),Q/=2,T/=2, U/=2,V=V<22?7: (V<30?1:(V<38?2:(V<44?4:(V==44?6:3)))) ,Q+=V&1?b:0,T +=V&2?b :0,U+=V &4?b:0) :(d==P?(g+=2 ,j=g>0?g/8:g/ 20):0,j >0?(U= j *j/M,Q =255- 250*U/M,T=255 -150*U/M,U=255 -100 *U/M):(U =j*j /M,U<M /5?(Q=255-210*U /M,T=255-435*U /M,U=255 -720* U/M):(U -=M/5,Q=213-110*U /M,T=168-113*U / M,U=111 -85*U/M) ),d!=P?(Q/=2,T/=2 ,U/=2):0);Q=Q< 0?0: Q>O? O: Q;T=T<0? 0:T>O?O:T;U=U<0?0: U>O?O:U;}R;G;B ;t(x,y ,a, b){n(M*J+M *40*(A*x +a)/X/A-M*20,M*K,M *L-M*30*(A*y+b)/Y/A+M*15,0,M,0,P, -1,0,0);R+=Q ;G+=T;B +=U;++a<A?t(x,y,a, b):(++b<A?t(x,y,0,b):0);}r(x,y){R=G=B=0;t(x,y,0,0);x<X?(printf("%c%c%c",R/A/A,G /A/A,B/A/A),r(x+1,y)):0;}s(y){r(0,--y?s(y),y:y);}main(){printf("P6\n%i %i\n255" "\n",X,Y);s(Y);} |
Автор: | Geniepro [ Пятница, 12 Октябрь, 2007 17:50 ] |
Заголовок сообщения: | Re: Очередной "прикол" от Си... |
А вот уже исскуство: Код: #include <math.h> Рабочий авиасимулятор... :о))
#include <sys/time.h> #include <X11/Xlib.h> #include <X11/keysym.h> double L ,o ,P ,_=dt,T,Z,D=1,d, s[999],E,h= 8,I, J,K,w[999],M,m,O ,n[999],j=33e-3,i= 1E3,r,t, u,v ,W,S= 74.5,l=221,X=7.26, a,B,A=32.2,c, F,H; int N,q, C, y,p,U; Window z; char f[52] ; GC k; main(){ Display*e= XOpenDisplay( 0); z=RootWindow(e,0); for (XSetForeground(e,k=XCreateGC (e,z,0,0),BlackPixel(e,0)) ; scanf("%lf%lf%lf",y +n,w+y, y+s)+1; y ++); XSelectInput(e,z= XCreateSimpleWindow(e,z,0,0,400,400, 0,0,WhitePixel(e,0) ),KeyPressMask); for(XMapWindow(e,z); ; T=sin(O)){ struct timeval G={ 0,dt*1e6} ; K= cos(j); N=1e4; M+= H*_; Z=D*K; F+=_*P; r=E*K; W=cos( O); m=K*W; H=K*T; O+=D*_*F/ K+d/K*E*_; B= sin(j); a=B*T*D-E*W; XClearWindow(e,z); t=T*E+ D*B*W; j+=d*_*D-_*F*E; P=W*E*B-T*D; for (o+=(I=D*W+E *T*B,E*d/K *B+v+B/K*F*D)*_; p<y; ){ T=p[s]+i; E=c-p[w]; D=n[p]-L; K=D*m-B*T-H*E; if(p [n]+w[ p]+p[s ]== 0|K <fabs(W=T*r-I*E +D*P) |fabs(D=t *D+Z *T-a *E)> K)N=1e4; else{ q=W/K *4E2+2e2; C= 2E2+4e2/ K *D; N-1E4&& XDrawLine(e ,z,k,N ,U,q,C); N=q; U=C; } ++p; } L+=_* (X*t +P*M+m*l); T=X*X+ l*l+M *M; XDrawString(e,z,k ,20,380,f,17); D=v/l*15; i+=(B *l-M*r -X*Z)*_; for(; XPending(e); u *=CS!=N){ XEvent z; XNextEvent(e ,&z); ++*((N=XLookupKeysym (&z.xkey,0))-IT? N-LT? UP-N?& E:& J:& u: &h); --*( DN -N? N-DT ?N== RT?&u: & W:&h:&J ); } m=15*F/l; c+=(I=M/ l,l*H +I*M+a*X)*_; H =A*r+v*X-F*l+( E=.1+X*4.9/l,t =T*m/32-I*T/24 )/S; K=F*M+( h* 1e4/l-(T+ E*5*T*E)/3e2 )/S-X*d-B*A; a=2.63 /l*d; X+=( d*l-T/S *(.19*E +a *.64+J/1e3 )-M* v +A* Z)*_; l += K *_; W=d; sprintf(f, "%5d %3d" "%7d",p =l /1.7,(C=9E3+ O*57.3)%0550,(int)i); d+=T*(.45-14/l* X-a*130-J* .14)*_/125e2+F*_*v; P=(T*(47 *I-m* 52+E*94 *D-t*.38+u*.21*E) /1e2+W* 179*v)/2312; select(p=0,0,0,0,&G); v-=( W*F-T*(.63*m-I*.086+m*E*19-D*25-.11*u )/107e2)*_; D=cos(o); E=sin(o); } } |
Автор: | Евгений Темиргалеев [ Суббота, 13 Октябрь, 2007 14:16 ] |
Заголовок сообщения: | Re: Очередной "прикол" от Си... |
Что-то у меня это искусство gcc компилирует. И как Си пробовал и как Си++... Как бы выявить в чем ошибки? ![]() |
Автор: | Geniepro [ Суббота, 13 Октябрь, 2007 18:48 ] |
Заголовок сообщения: | Re: Очередной "прикол" от Си... |
Евгений Темиргалеев писал(а): Что-то у меня это искусство gcc компилирует. И как Си пробовал и как Си++... Как бы выявить в чем ошибки? Попробовал скомпилировать виндовой версией GCC 3.4.5 из комплекта GHC 6.6 - нет юниксовых хедеров X11/Xlib.h и X11/keysym.h... Эта прога под Юникс, видимо... :о))
|
Автор: | Евгений Темиргалеев [ Воскресенье, 14 Октябрь, 2007 18:58 ] |
Заголовок сообщения: | Re: Очередной "прикол" от Си... |
Вот у меня под ASP и не скомпилировалось... А это вроде юникс как-никак %) |
Автор: | PGR [ Воскресенье, 14 Октябрь, 2007 19:39 ] |
Заголовок сообщения: | Re: Очередной "прикол" от Си... |
А как вам такой вариант искусства: http://99-bottles-of-beer.net/language-perl-737.html |
Автор: | Geniepro [ Воскресенье, 14 Октябрь, 2007 20:41 ] |
Заголовок сообщения: | Re: Очередной "прикол" от Си... |
Евгений Темиргалеев писал(а): Вот у меня под ASP и не скомпилировалось... А это вроде юникс как-никак %) Линукс - не Юникс... :о) |
Автор: | Wlad [ Воскресенье, 14 Октябрь, 2007 22:13 ] |
Заголовок сообщения: | Re: Очередной "прикол" от Си... |
Darksnake писал(а): Меня вот например вот такие вещи Код: if( KBD_wait-- == 0 ) убивают сразу... Поэтому и не люблю я СИ... Всяка мядаль - с двумя сторонами... Я тоже люблю порассуждать "чего не нравица" или "как правильна"... Но вот не попрёшь против такого: Код: switch( a) { ... break; case A1: case A2: case A3: if (cond) case A4: case A5: DoThis(); else case A6: case A7: case A8: DoThat(); DoCommonThings(); break; ... } "Дико"? - Да! Не структурно? - 101%! Зато это сэкономило мне (не в одном месте такой "изврат"!) кучу ячеек и я влез-таки в ОЗУ мкроконтроллера! А это значит - выполненный проект. Со всеми втекающими! :о) Возражения, типа "ну и писали бы сразу на ассемблере" НЕ принимаются! На ассемблере ТАК быстро писать с таким выходом кода - не получается... |
Автор: | Geniepro [ Понедельник, 15 Октябрь, 2007 11:06 ] |
Заголовок сообщения: | Re: Очередной "прикол" от Си... |
Владимир Лось писал(а): "Дико"? - Да! Вы это самое, того...Не структурно? - 101%! Зато это сэкономило мне (не в одном месте такой "изврат"!) кучу ячеек и я влез-таки в ОЗУ мкроконтроллера! А это значит - выполненный проект. Со всеми втекающими! :о) Не забудьте задокументировать и подробнейше описать, pачем Вы так сделали, и что конкретно и где это Вам дало. Через полгода Вы сами это месть понять не сможете, не говоря уже о других... :о)) |
Автор: | Сергей Губанов [ Четверг, 18 Октябрь, 2007 13:59 ] |
Заголовок сообщения: | Re: Очередной "прикол" от Си... |
Ещё один прикол от Си. Я сегодня написал вместо: Код: void ReadQualyIdent (Parser &ps, std::string &ident1, std::string &ident2) { ... ident2 = ps.scanner.ident; ... } вот это: Код: void ReadQualyIdent (Parser &ps, std::string &ident1, std::string &ident2) { ... ident2 = ps.symbol; ... } Компилятор MS VS 2005 это дело прекрасно скомпилировал, не смотря на то, что переменная ps.symbol имеет тип enum, а не std::string. В результате во время выполнения программы появился "мусор в памяти". |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |