1. Лучший говнокод

    В номинации:
    За время:
  2. Си / Говнокод #28320

    +5

    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
    // Heap memory allocate function (must not be used!)
    caddr_t _sbrk(int incr) {
        <...>
        void some_bastard_called_sbrk();
        some_bastard_called_sbrk(); // Produce linker error in case it is used
    }
    
    _ATTRIBUTE ((__format__ (__printf__, 1, 2)))
    int	printf (const char *__restrict format, ...)
    {
        <маленький трехколесный велосипед>
    }
    
    int	putchar(int c) 
    {
        <...> 
    }
    int	puts(const char *s) 
    {
        <...> 
    }
    
    _ATTRIBUTE ((__format__ (__printf__, 2, 3)))
    int	sprintf (char *__restrict s, const char *__restrict format, ...)
    {
        <...> 
    }

    STM32. Я просто хочу использовать printf для вывода в последовательный порт и не течь. Ведь для этого нужно только реализовать int _write(int file, char *data, int len) и всё. Ой, а почему иногда программа падает где-то в кишках рантайма?

    Может, стек переполняется? Да нет, проверил, значения в норме...

    Просто стандартная библиотека от ST - это не курсовая ардуинщика, тут все системно, хендлы потоков, дескрипторы устройств и управляющие структуры. При первом обращении printf (и sprintf тоже!) выделяет себе в куче около 400 байт. Замечательное решение, помогающее сэкономить память, если мы не используем стандартный вывод! А куча тут - это просто последовательно заполняемая область памяти, размеры которой задаются в linker script (я вообще 0 указал, я ведь не использую malloc). Проверять выход за пределы кучи мы, конечно, не будем - зачем, когда рядом такая замечательная, никому не нужная область стека.
    Да, и если забыть отключить буферизацию setvbuf(stdin/stdout/stderr, NULL, _IONBF, 0); , то он выделит не 400 байт, а килобайт (на контроллере с 8K RAM).

    В общем, ах, оставьте меня, сам все напишу.
    Только надо еще putchar и puts реализовать, а то компилятор любит printf'ы оптимизировать. И не забыть, что puts добавляет перевод строки. Уф, вроде все.

    Steve_Brown, 05 Августа 2022

    Комментарии (21)
  3. C++ / Говнокод #28318

    +3

    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
    AnsiString Cut_the_path(AnsiString ExeName)
    {
        AnsiString Path = ExeName;
        char *cp = Path.c_str(); int last = Path.Length()-1;
        int i=last;
        for(; i>=0; i--)
        {
            if( *(cp+i) == '\\' )
                break;
            Path.Delete(Path.Length(),1);
        }
        return Path;
    }

    FataLL, 04 Августа 2022

    Комментарии (151)
  4. C++ / Говнокод #28326

    +2

    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
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    90. 90
    91. 91
    92. 92
    93. 93
    94. 94
    95. 95
    96. 96
    97. 97
    98. 98
    99. 99
    #include <stddef.h>
    #include <stdio.h>
    #include <utility>
    #define PLACEHOLDER char x[0];
    
    #define FORCEINLINE 
    template <typename T, typename... Ts> struct MyTuple : MyTuple<Ts...>
    {
    	FORCEINLINE constexpr MyTuple(T&& t, Ts&&... ts)
    		: value(std::move(t))
    		, MyTuple<Ts...> (std::forward<Ts>(ts)...){}
    	FORCEINLINE explicit MyTuple(const MyTuple<T,Ts...> &other) = default;
    	FORCEINLINE MyTuple(MyTuple<T,Ts...> &&other)
    		: MyTuple<Ts...>(std::forward<MyTuple<Ts...>>(other)),
    		value(std::move(other.value)){}
    
    	FORCEINLINE constexpr int size() const { return 1 + MyTuple<Ts...>::size(); }
    	constexpr static int sz = 1 + MyTuple<Ts...>::sz;
    	FORCEINLINE MyTuple<Ts...> &next(){return *static_cast<MyTuple<Ts...>*>(this);}
    	using tnext = MyTuple<Ts...>;
    	T value;
    	FORCEINLINE ~MyTuple() {}
    	constexpr static bool isitem = false;
    };
    struct MyTupleEmpty
    {
    	PLACEHOLDER
    	FORCEINLINE constexpr int size() const { return 0; }
    	static constexpr int sz = 0;
    	~MyTupleEmpty() {}
    	constexpr static bool isitem = false;
    };
    
    template <typename T> struct MyTuple<T> {
    	FORCEINLINE MyTuple(T&& t) : value(std::move(t)){}
    	FORCEINLINE explicit MyTuple(const MyTuple<T> &other) = default;
    	FORCEINLINE MyTuple(MyTuple<T> &&other): value(std::move(other.value)){}
    
    	FORCEINLINE MyTupleEmpty &next() const{
    		static MyTupleEmpty empty;
    		return empty;
    	}
    	FORCEINLINE constexpr int size() const { return 1; }
    	constexpr static int sz = 1;
    	using tnext =MyTupleEmpty;
    	T value;
    	FORCEINLINE ~MyTuple() {}
    	constexpr static bool isitem = false;
    };
    template <class T>struct unwrap_refwrapper{using type = T;};
    template <class T>struct unwrap_refwrapper<std::reference_wrapper<T>>{using type = T&;};
     template <class T> using unwrap_decay_t = typename unwrap_refwrapper<typename std::decay<T>::type>::type;
    template<typename... Ts>
    static FORCEINLINE MyTuple<unwrap_decay_t<Ts>...> MakeTuple(Ts&&... args)
    {
    	return MyTuple<unwrap_decay_t<Ts>...>(std::forward<Ts>(args)...);
    }
    struct i3{
        auto setProp(auto x, i3 t = *(i3*)0)
        {
            typename decltype(x(*this))::tp c;
            return c;
        }
        using tp = i3;
    };
    
    
    #define s(x,y) setProp([](auto c){struct xxx: decltype(c)::tp{decltype(y) x = y;using tp = xxx;    decltype([] (auto xx, xxx &t = *(xxx*)0)\
        {\
            typename decltype(xx(t))::tp c;\
            return c;\
        }) setProp;auto BeginChildren(){return *this;}} d;return d;})
    
    #define c(...) BeginChildren(),MakeTuple(__VA_ARGS__)
    #define i(...) i3()
    
    
    
    
    void func2()
    {
        auto tp = MakeTuple(
        i(Window)
            .s(width,10)
            .s(height,20)
            .c(
                i(Item),
                i(Item2)
                    .s(property1,10.0f)
    
            )
        );
        printf("%d %d %f\n",tp.value.height,tp.value.width, tp.next().value.next().value.property1);
    }
    
    int main()
    {
        func2();
    }

    qml-like структура в compile time
    Стандартизаторы всё пытались запретить шаблоны в локальных классах, да не вышло - понаоставляли дыр в лямбдах и decltype.
    Если добавить -fpermissive, то gcc сожрёт даже с constexpr

    mittorn, 09 Августа 2022

    Комментарии (15)
  5. C++ / Говнокод #28313

    +2

    1. 1
    2. 2
    3. 3
    } catch (...) {
        // ¯\_(ツ)_/¯
    }

    Ну заебись комментарий

    3_dar, 02 Августа 2022

    Комментарии (2)
  6. Си / Говнокод #28325

    +1

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    unsigned mul(unsigned a, unsigned b)
    {
     char arr[a][b];
     return &arr[a][b] - (char *)arr;
    }

    Умножение через VLA

    j123123, 09 Августа 2022

    Комментарии (57)
  7. Куча / Говнокод #28324

    +1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    Когда-то, когда мне было только 20, и я был одержим кодингом, ибо не познал ещё обратную, рутинную сторону инжинеринга (это 
    когда ты вместо того, чтобы воплощать свои идеи связан по рукам и ногам и тебя имеют во все дыры твой зав. отделом шеф и эксперт),  -
     я был романтиком и мечтал собрать команду из молодых программистов, чтобы общими силами разработать интерпрайзный 
    платный либо бесплатный полезный продукт и создать своей команде имя. 
    
    Я хотел зарабатывать на софтах. Потом, взрослея, я понял, что в такой стране как Россия моя идея сгнила ещё на корню.
    Инициативы никому не нужны, ни одному работодателю.  Это я очередной раз понял, когда пытался автоматизировать ручной труд 
    целого отдела в одной из владикавказских шараг. Нет, нам не надо. Лучше по-старинке, с дубинушкой, и похуй, что этот сизифов труд 
    десятка мартышек нахуй никому не нужен.
    
    Если же ты хочешь воплощать сугубо свои желания (не завися от шефов), ты пишешь либо фри, либо долго 
    ищешь таких же двинутых на голову, которые готовы тратить свое время ради туманных перспектив и собираешь из них команду.

    О, сколько было светлых надежд...

    Support, 08 Августа 2022

    Комментарии (43)
  8. Куча / Говнокод #28323

    +1

    1. 1
    Из-за тебя ушел я, %username%!

    Ня, пока.

    hormand, 08 Августа 2022

    Комментарии (1)
  9. Куча / Говнокод #28321

    +1

    1. 1
    Клон меня запарил. Уйду я наверно.

    Ня, пока.

    bormanb, 07 Августа 2022

    Комментарии (0)