1. C++ / Говнокод #24501

    0

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    // https://habr.com/company/JetBrains/blog/249479/
    
    Привет, Хабр!
    
    Некоторое время назад мы объявили конкурс — требовалось продолжить фразу:
    Бьёрн Страуструп создал С++ 36 лет назад, и он до сих пор востребован и пользуется популярностью у разработчиков, потому что...
    
    Спасибо всем участникам за массу положительных эмоций и разнообразные предположения о том, что же сделало C++ таким популярным.

    Посовещавшись, мы выбрали топ-6 ответов:

    j123123, 16 Июля 2018

    Комментарии (63)
  2. C++ / Говнокод #24487

    +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
    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
    // https://habr.com/post/417027/
    // Как я стандартную библиотеку C++11 писал или почему boost такой страшный
    // https://github.com/oktonion/stdex/blob/1472fd5e2f5e0d10a136518631055c3aad2e1cfd/stdex/include/thread.hpp#L51
    
    
    		template<class R, class T1>
    		struct _function_traits<R(*)(T1)>
    		{
    			typedef R result_type;
    			typedef T1 arg1_type;
    			typedef T1 argument_type;
    		};
    
    		template<class R, class T1, class T2>
    		struct _function_traits<R(*)(T1, T2)>
    		{
    			typedef R result_type;
    			typedef T1 arg1_type;
    			typedef T2 arg2_type;
    			
    			
    		};
    
    		template<class R, class T1, class T2, class T3>
    		struct _function_traits<R(*)(T1, T2, T3)>
    		{
    			typedef R result_type;
    			typedef T1 arg1_type;
    			typedef T2 arg2_type;
    			typedef T3 arg3_type;
    		};
    
    		template<class R, class T1, class T2, class T3, class T4>
    		struct _function_traits<R(*)(T1, T2, T3, T4)>
    		{
    			typedef R result_type;
    			typedef T1 arg1_type;
    			typedef T2 arg2_type;
    			typedef T3 arg3_type;
    			typedef T4 arg4_type;
    		};
    
    		template<class R, class T1, class T2, class T3, class T4,
    			class T5>
    		struct _function_traits<R(*)(T1, T2, T3, T4, T5)>
    		{
    			typedef R result_type;
    			typedef T1 arg1_type;
    			typedef T2 arg2_type;
    			typedef T3 arg3_type;
    			typedef T4 arg4_type;
    			typedef T5 arg5_type;
    		};
    
    		template<class R, class T1, class T2, class T3, class T4,
    			class T5, class T6>
    		struct _function_traits<R(*)(T1, T2, T3, T4, T5, T6)>
    		{
    			typedef R result_type;
    			typedef T1 arg1_type;
    			typedef T2 arg2_type;
    			typedef T3 arg3_type;
    			typedef T4 arg4_type;
    			typedef T5 arg5_type;
    			typedef T6 arg6_type;
    		};
    
    		template<class R, class T1, class T2, class T3, class T4,
    			class T5, class T6, class T7>
    		struct _function_traits<R(*)(T1, T2, T3, T4, T5, T6, T7)>
    		{
    			typedef R result_type;
    			typedef T1 arg1_type;
    			typedef T2 arg2_type;
    			typedef T3 arg3_type;
    			typedef T4 arg4_type;
    			typedef T5 arg5_type;
    			typedef T6 arg6_type;
    			typedef T7 arg7_type;
    		};
    
    ...

    > На дворе был 2017 год! Уже C++ 17 активно вводился в GCC, clang, Visual Studio, везде был decltype (since C++ 11), constexpr (since C++ 11, но существенно доработан), модули уже почти на подходе, хорошее время было. Я же находился на работе и с некоторым неодобрением смотрел на очередной Internal Compiler Error в своем Borland C++ Builder 6.0, а так же на множество ошибок сборки с очередной версией библиотеки boost. Думаю, теперь вы понимаете, откуда взялась эта тяга к велосипедостроению. У нас использовался Borland C++ Builder 6.0 и Visual Studio 2010 под Windows, g++ версии 4.4.2 или ниже под QNX и под некоторые unix системы. От MacOS мы были избавлены, что несомненно было плюсом. Ни о каких других компиляторах (под C++ 11 в том числе) речи даже быть не могло по соображениям, которые мы оставим за пределами данной статьи.

    > «А что там может быть на столько сложного» — закралась мысль в мой измученный попытками завести boost под старый-добрый builder мозг. «Мне всего то нужно type_traits, thread, mutex, возможно chrono, nullptr было бы еще неплохо.» — рассудил я и принялся за работу.

    j123123, 13 Июля 2018

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

    0

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <inttypes.h>
    
    void test1(void)
    {
      printf("test1\n");
    }
    void test2(void)
    {
      printf("test2\n");
    }
    void test3(void)
    {
      printf("test3\n");
    }
    void test4(void)
    {
      printf("test4\n");
    }
    
    uint8_t func_dist[3] = {(uint8_t)((char *)test2-(char *)test1), (uint8_t)((char *)test3-(char *)test2), (uint8_t)((char *)test4-(char *)test3)};
    
    void callf(uint8_t fn)
    {
      size_t sum_dis = 0;
      for (uint8_t i = 0; i < fn; i++)
      {
        sum_dis += func_dist[i];
      }
      ( (void(*)(void)) ((char *)test1+sum_dis) )  ();
    }
    
    int main(void)
    {
      callf(0);
      callf(1);
      callf(2);
      callf(3);
      return EXIT_SUCCESS;
    }

    Зожатие указателей. Главное чтоб длины функций не превышали 255 и чтоб функции шли строго подряд, как они объявлены кода
    Как сделать чтобы это компилировалось сишкой?

    j123123, 10 Июля 2018

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

    0

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    body {background: url("http://forumfiles.ru/files/0008/ea/f4/23438.jpg") repeat-y scroll center top transparent;}
    #logotop {background-image: url("http://forumfiles.ru/files/0008/ea/f4/46264.png"); margin-left: -33px;}
    #pun {background-image: url("http://forumfiles.ru/files/0008/ea/f4/21620.jpg");}
    .punbb .section .container, .punbb .post-body, .punbb .post-links, .punbb td.tc2, .punbb td.tc3, .punbb .formal fieldset .post-box, #viewprofile li strong, #viewprofile li div, #setmods dd, .punbb .info-box, .punbb #pun-main .info-box .legend {color: #777;}
    .punbb .post h3 span, .punbb th, #viewprofile li, #setmods dl {color: #777;}

    Северянин

    joneshookrogers, 08 Июля 2018

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

    0

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    https://github.com/mikael-s-persson/templight
    Templight 2.0 - Template Instantiation Profiler and Debugger
    
    Templight is a Clang-based tool to profile the time and memory consumption of
    template instantiations and to perform interactive debugging sessions to gain
    introspection into the template instantiation process.

    Шаблонные метапрограммисты будут довольны.
    Осталось еще сделать такое же, но чтобы constexpr можно было профилировать и интерактивно дебажить

    j123123, 02 Июля 2018

    Комментарии (20)
  6. C++ / Говнокод #24436

    0

    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
    // Функция считывания списка из файла
    	private: int readContactList( System::String^ path ) {
    		contact_list_->clear();
    		try {
    			System::IO::StreamReader^ reader = gcnew System::IO::StreamReader( path ); // Объект чтения из файла
    			try {
    				System::String^ line; // считываемая строка
    				array<String^>^ contact = gcnew array<String^>( 32 ); // считываемая строка будет разбиваться 
    				array<String^>^ separator = { " " }; // разделитель строки - пробел
    				list_node* node; // вершина списка
    
    				while( line = reader->ReadLine() ) { 
    					contact = line->Split( ' ' ); // разделяем строку по пробелам
    					if ( contact->Length != 3 ) // Должно быть три числа
    						return 4;
    					try {
    						node = new list_node(); // Заводим вершину и инициализируем ее поля
    						node->element_number_ = Int32::Parse( contact[ 0 ] );
    						node->circuit_number_ = Int32::Parse( contact[ 1 ] );
    						node->contact_number_ = Int32::Parse( contact[ 2 ] );
    
    						contact_list_->pushBack( node );
    					} catch (Exception^ e) { // В случае ошибки удаляем вершину из кучи и выходим
    						delete node;
    						return 4;
    					}
    				}
    			} catch ( Exception^ e ) {
    				return 2;
    			}
    		} catch ( Exception^ e ) {
    			return 1;
    		}
    		return 0;
    	}

    Больше try - catch.
    Поля структуры не инкапсулировал потому, что тот, кому нужна эта программа не знает про инкапсуляцию.
    Кстати, сделано по примеру с MSDN

    OlegUP, 02 Июля 2018

    Комментарии (154)
  7. C++ / Говнокод #24432

    +3

    1. 1
    2. 2
    3. 3
    class ... {
        void enable(bool enabled = false);
    }

    tar_gz, 30 Июня 2018

    Комментарии (11)
  8. C++ / Говнокод #24363

    −1

    1. 1
    std::function<CPlayer*> pickedUp = nullptr;

    vadzz, 06 Июня 2018

    Комментарии (10)
  9. C++ / Говнокод #24352

    +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
    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
    void Table::draw() {
    	SetConsoleCursorPosition(consOutput, { 0,0 });
    	for (int i = 0; i < lY*(lengthOfCageY + 1) + 1; i++) {
    		for (int j = 0; j < lX*(lengthOfCageX + 1) + 1; j++) {
    			if (i == 0 && j == 0)
    				cout << (char)201;
    			else if (i == 0 && j == lX*(lengthOfCageX + 1))
    				cout << (char)187;
    			else if (i == lY*(lengthOfCageY + 1) && j == 0)
    				cout << (char)200;
    					else
    						if (i == lY*(lengthOfCageY + 1) && j == lX*(lengthOfCageX + 1))
    							cout << (char)188;
    						else
    							if (i == 0)
    								if (j % (lengthOfCageX + 1) == 0)
    									cout << (char)203;
    								else
    									cout << (char)205;
    							else
    								if (i == lY*(lengthOfCageY + 1))
    									if (j % (lengthOfCageX + 1) == 0)
    										cout << (char)202;
    									else
    										cout << (char)205;
    								else
    									if (j == 0)
    										if (i % (lengthOfCageY + 1) == 0)
    											cout << (char)204;
    										else
    											cout << (char)186;
    									else
    										if (j == lX*(lengthOfCageX + 1))
    											if (i % (lengthOfCageY + 1) == 0)
    												cout << (char)185;
    											else
    												cout << (char)186;
    										else
    											if (i % (lengthOfCageY + 1) == 0 && j % (lengthOfCageX + 1) == 0)
    												cout << (char)206;
    											else
    												if (i % (lengthOfCageY + 1) == 0)
    													cout << (char)205;
    												else
    													if (j % (lengthOfCageX + 1) == 0)
    														cout << (char)186;
    													else
    														cout << " ";
    		}
    		cout << endl;
    	}
    }

    И прекрасно и ужасно. Плохой но хороший код для вывода красивой таблицы в консоль

    the-alator, 03 Июня 2018

    Комментарии (0)
  10. C++ / Говнокод #24332

    0

    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
    // Tools.cpp
    
    class SleepQClass : public QThread
    {
    public:
    	static void Sleep( int ms )
    	{
    		msleep(ms); // static msleep is protected
    	}
    };
    
    void SleepQ( int ms )
    {
    	SleepQClass::Sleep(ms);
    }

    Паблик Морозов. Делаем глобальную функцию Sleep, чтобы можно было вызывать из любого места и потока. А что, реализация все равно тот же Sleep(DWORD dwMilliseconds) вызывает.

    Steve_Brown, 28 Мая 2018

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