1. Си / Говнокод #1761

    +133

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    //рекурсивная процедура создающая структуру меню
    byte form_hash(phasharray vrarr, WORD* ni, byte* ne)
    {
    	byte ct=MainMenu[(*ni)].numSubMenus, ict;
    	phasharray	vrarrcr;
    
    	if((*ni)++==0) pmain=vrarr; // если первый проход - запоминаем ссылку на главное меню
    	for (ict=0; ict<ct; ict++)
    	{
    		vrarr->hash[ict].pitem=(tmenuitem*)RTKGetBuffer(&menuPool);
    		//инициализация строки элемента
    		scopy0(((*((*vrarr).hash[ict].pitem)).menustr), MainMenu[*ni].nameMenu);
    		if (MainMenu[*ni].numSubMenus!=0)
    		{
    			(*((*vrarr).hash[ict].pitem)).pnextlev=RTKGetBuffer(&hashMenuPool);// создание хэша
    			vrarrcr=(phasharray)(*((*vrarr).hash[ict].pitem)).pnextlev;//вводим новую переменную для облегчения доступа к созданной структуре
    			(*vrarr).hash[ict].quantity=(byte)MainMenu[*ni].numSubMenus;//запоминаем количество элементов в меню уровнем выше
    			(*vrarrcr).pPrevLev=vrarr; // ссылка на предыдущий элемент
    			(*((*vrarr).hash[ict].pitem)).fpmenu=true;
    			if (MainMenu[*ni].numSubMenus==MENU_FUNC) // вызов процедуры динамического формирования меню
    			{
    				menupr_params.vrarr=vrarrcr;
    				menupr_params.phashprev=vrarr;
    				menupr_params.ni=ni;
    				menupr_params.ne=ne;
    				menupr_params.ict=ict;
    				(MainMenu[*ni].pproc)(); 
    				(*ni)++;
    			} else 
    			{
    				if(MainMenu[*ni].pproc) // если исключение (перед входом в подменю необходимо выполнить функцию)
    				{
    					changeArr[(*ne)++]=vrarrcr;
    					(*((*vrarr).hash[ict].pitem)).pexec=MainMenu[*ni].pproc;
    					(*((*vrarr).hash[ict].pitem)).fpmenu=false;
    				};
    				// исправляем значение элементов
    				(*(vrarr)).hash[ict].quantity=form_hash(vrarrcr, ni, ne);
    			};
    			// проверка сформированного меню
    			switch ((*(vrarr)).hash[ict].quantity)
    			{
    			case MENU_NO: // нет подменю
    				// освободить эл-т
    				RTKFreeBuffer(&hashMenuPool, vrarrcr); 
    				(*((*(vrarr)).hash[ict].pitem)).pexec=*menu_refresh;
    				(*((*(vrarr)).hash[ict].pitem)).fpmenu=false;
    				break;
    			case MENU_NOEL: // не формировать эл-т
    				// освободить эл-т
    				RTKFreeBuffer(&hashMenuPool, vrarrcr); 
    				RTKFreeBuffer(&menuPool, vrarr->hash[ict].pitem);
    				ict--;
    				ct--;
    				break;
    			case MENU_FUNC: // нет подменю, нормальная функция
    				RTKFreeBuffer(&hashMenuPool, vrarrcr); 
    				(*(vrarr)).hash[ict].quantity=0; 
    				//(*((*vrarr).hash[ict].pitem)).fpmenu=false;
    				break;
    			}
    		} else // заполнение элемента
    		{
    			(*((*vrarr).hash[ict].pitem)).pexec=MainMenu[*ni].pproc;
    			(*((*vrarr).hash[ict].pitem)).fpmenu=false;
    			(*ni)++;
    		};
    	};
    	return ct;
    };

    Эх, бурная была молодость :-)

    Запостил: Barmaglot, 04 Сентября 2009

    Комментарии (26) RSS

    • Смущает частое повторение строчки vrarr->hash[ict].pitem...
      А в целом, на С по другому и не напишешь, язык такой :(
      Ответить
      • Не только можно, но и нужно писать по другому. Язык, конечно, оказывает влияние, но ничто не оправдывает нечитаемого говнокода рекурсивной функции, которая даже не помещается на страницу. На С можно писать отличный качественный код. К сожалению это я понял только через несколько лет после написания этого "шедевра".
        Ответить
      • Да, на тех участках, где значение vrarr не меняется, можно закэшировать vrarr->hash[ict].

        Тут ещё стили смешаны: где-то звёздочка и точка, а где-то ->
        Ответить
    • Давно нишу на чистом си в ООП. Такого ужаса не бывает никогда. Более того, код ясней и легче обычно выходит, чем вышел бы на с++. Инструмент не виноват, что его берут в кривые руки... В код сильно не вникал, но тут похоже нужно было просто раскидать на несколько небольших, но читаемых вспомогательных функций и всё.
      Ответить
      • ООП на чистом C нет
        Ответить
        • Дурашка, средствами синтаксиса нет, но средствами семантики есть. Если ты упоротый дурачок, у которого язык упирается в синтаксис (хотя главное - семантика), то почитай Луговского (особенно небезызвестный тред на sql.ru -- там про тааких как ты разжёвано хорошо)

          С уважением, guest.
          Ответить
          • Можешь привести пример класса «средствами семантики»?
            Ответить
          • У меня на заборе про таакииих написано, что это окончательно неоспоримо и бесповоротно доказывает превосходство моих филосовских взглядов на языки над превосходством
            Ответить
    • > (*vrarr).hash

      В сишку стрелку не завезли? Именно поэтому я за «PHP».
      Ответить
      • Почему ты тогда не за «Python»? В него длинную арихметику завезли, а в «PHP» нужно вспоминать, как работать с функциями из расширения «GMP» или «BCMath».
        Ответить
        • А как это относится к вышенасранному говнокоду?
          Ответить
          • Никак. Просто гипотеза, какой язык может понадобиться математику из рашки.
            Ответить
            • Ааа. «R» конечно же.
              Ответить
              • https://habr.com/post/506656/
                >>> Пока, Python. Привет, Julia❗
                >>> По мере того, как Python замедляет свой впечатляющий темп, растёт новый сильный конкурент.
                >>> Этим же руководствуются создатели Julia: они хотят сохранить хорошее из других языков и отбросить плохое. Но в случае с Julia стои́т гораздо более амбициозная задача: вместо того, чтобы заменить какой-то один язык, она хочет превзойти их всех.
                >>> Вот что сами говорят создатели языка:
                Мы ненасытны: мы хотим большего.
                
                Нам нужен язык с открытым исходным кодом, со свободной лицензией.
                Мы хотим скорость Си с динамикой Ruby. Мы хотим, чтобы язык был
                гомоиконическим, с настоящими макросами, такой как Lisp, но с очевидными,
                знакомыми математическими сущностями, такой как Matlab. Мы хотим
                настолько же удобное для общего программирования, как Python, такое же простое
                для статистики, как R, такое же естественное для обработки строк, как Perl, такое же
                мощное для линейной алгебры, как Matlab, и способное объединять все эти возможности
                под одной оболочкой. Нечто простое в освоении, но при этом радующее самых серьёзных
                хакеров. Мы хотим, чтобы язык был интерактивным, и мы хотим, чтобы он был компилируемым.

                Дядя Пи, смотри, тут анскильные лалки опять на сишку покушаются!
                Ответить
                • Джу-ли Джулия,
                  Джу-ли Джулия
                  О-о-о
                  Ответить
                  • https://youtu.be/9Bs6If7Ilfk
                    Ответить
                    • На ютубе аудио выкладывают как видео. Какой багор )))
                      Ответить
                      • Дык оверхеда почти нет, статическая картинка идеально жмётся. Иногда ещё эквалайзер или какие-нибудь эффекты подрисовывают.
                        Ответить
                • http://www.zverovich.net/2016/05/13/giving-up-on-julia.html
                  Ответить
                • >Пока, Python. Привет, Julia❗
                  Скорее покушаются на Путуха.

                  >Мы хотим, чтобы язык был гомоиконическим, такой как Lisp

                  Дальше уже не читал, вспомнил знаменитое гоатсеиконное ascii.
                  Ответить
                  • > Скорее покушаются на Путуха.
                    Там дальше и сишку гнобят:
                    >>> Разработчики Julia хотели получить такой же быстрый язык, как C — но то, что они создали, стало ещё быстрее.
                    Ответить
                    • >но то, что они создали, стало ещё быстрее

                      Такие заявы могут кидать или тролли, или придурки-маркетолухи.

                      Пруфлинк ведёт говносайт medium.com c julia-vs-python

                      Оттуда ещё один пруфлинк

                      Сюда
                      https://discourse.julialang.org/t/comparing-python-julia-and-c/17019

                      Comparing Python, Julia, and C++

                      С, C++. Действительно какая разница?
                      Ответить
                    • >такой же быстрый язык, как C — но то, что они создали, стало ещё быстрее.

                      Дибил-переводчик даже не сходил по своим же ссылкам, и обосрался.

                      В бенче С++.

                      https://github.com/ziotom78/python-julia-c-/blob/master/c%2B%2B-speed.cpp

                      I created three codes in Julia 1.0, Python3+NumPy, and C++. In each code, I run simple computations on large arrays, with an increasing number of parameters.

                      Julia is significantly faster than C++, even when using -O3 with g++. In order to help C++, I cheated and modified the C++ code so that functions f, g, etc. no longer allocate the vector containing the result, which is instead allocated before the benchmark starts (see the code on GitHub). However, as you can see from the plot, Julia is still the best!

                      For n = 2, C++ is the slowest solution
                      Ответить
                  • (((L I S P )( L I S P ) ( L I S P ) ( L I S P )))
                    * (     \             \            )    \       *
                    B(       )             \          )      )      B
                    e(       `.             )         )       :     e
                    a`        )             )        \)       )     a
                    t \       ) )       )  \\\   --__ \\       :    t
                    i  \      \)   _--~~          ~--__) \     )    i  
                    n   \      \_-~                    ~-_\    )    n
                    g    \_     \        _.--------.______\)   )    g
                          \     \______(( _ ___ _ (_(__H  \   )      
                    t      \   .  S ___)  ______ (_(____t  )  )     t
                    h       (\ )   I ____)) APPLY\ (_____D  )_)     h
                    e      ( (\)   C_____)  EVAL )  (___P   )  \    e
                          (   (   _P_____)\______)  )) _) )     \    
                    a     (    \  )__   \\_________)) (__)       )  a
                    v    ( \    \____)   `----   --'             )  v
                    e    (  \_          ___\       )_          _) ) e
                    r   (              )    (     )  \            ) r
                    a   (             )    (   λ   )  \           ) a
                    g   (          ) )    (         )  \           )g
                    e   (         ) )      (__)(___)    )          )e
                    s  (           )        (    )       )         )s
                    *  (          )         (    )       )         )*
                    (((L I S P )( L I S P ) ( L I S P ) ( L I S P )))
                    Ответить
                • А получится в итоге скорость скриптушни с безопасностью си и читабельностью перла.
                  Ответить
          • По поводу вышенасранного кода: какие подводные камни у использования «C++» в качестве «better C»?
            Ответить

    Добавить комментарий