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

    −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
    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
    BYTE1 *GetLanguageCodeString( BYTE1	upper, BYTE1 lower , BYTE1  *lang_idx )
    {
    	int index = 0;
    	
    	switch(upper){
    		case 'a' :
    			switch(lower){
    				case 'a' : index = 0; break;
    				case 'b' : index = 1; break;
    				case 'f' : index = 2; break;
    				case 'm': index = 3; break;
    				case 'r': index = 4; break;
    				case 's': index = 5; break;
    				case 'y': index = 6; break;
    				case 'z': index = 7; break;
    				default: break;
    			}
    			break;
    		case 'b' :
    			switch(lower){
    				case 'a' : index = 8; break;
    				case 'e' : index = 9; break;
    				case 'g' : index = 10; break;
    				case 'h': index = 11; break;
    				case 'i': index = 12; break;
    				case 'n': index = 13; break;
    				case 'o': index = 14; break;
    				case 's': index = 136; break;	/* Added in SEIN 2004.04.01 KTJ */
    				default: break;
    			}
    			break;
    		case 'c' :
    			switch(lower){
    				case 'a' : index = 15; break;
    				case 'o' : index = 16; break;
    				case 's' : index = 17; break;
    				case 'y': index = 18; break;
    				default: break;
    			}
    			break;
    		case 'd' :
    			switch(lower){
    				case 'a' : index = 19; break;
    				case 'e' : index = 20; break;
    				case 'z' : index = 21; break;
    				default: break;
    			}
    			break;			
    		case 'e' :
    			switch(lower){
    				case 'l' : index = 22; break;
    				case 'n' : index = 23; break;
    				case 'o' : index = 24; break;
    				case 's': index = 25; break;
    				case 't': index = 26; break;
    				case 'u': index = 27; break;
    				break;
    			}
    			break;
    		case 'f' :
    			switch(lower){
    				case 'a' : index = 28; break;
    				case 'i' : index = 29; break;
    				case 'j' : index = 30; break;
    				case 'o': index = 31; break;
    				case 'r': index = 32; break;
    				case 'y': index = 33; break;
    				default: break;
    			}
    			break;
    		case 'g' :
    			switch(lower){
    				case 'a' : index = 34; break;
    				case 'd' : index = 35; break;
    				case 'l' : index = 36; break;
    				case 'n': index = 37; break;
    				case 'u': index = 38; break;
    				default: break;
    			}
    			break;
    		case 'h' :
    			switch(lower){
    				case 'a' : index = 39; break;
    				case 'e' : index = 40; break;
    				case 'i' : index = 41; break;
    				case 'r': index = 42; break;
    				case 'u': index = 43; break;
    				case 'y': index = 44; break;				
    				default: break;
    			}
    			break;			
    		case 'i' :
    			switch(lower){
    				case 'a' : index = 45; break;
    				case 'd' : index = 46; break;
    				case 'k': index = 47; break;
    				case 'n': index = 48; break;				
    				case 's': index = 49; break;
    				case 't': index = 50; break;

    питушня на switch для распознавания какой-то фигни с буквами

    Запостил: j123123, 30 Июля 2017

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

    • вот как надо распознавать, чисти давай!
      #define TW(a,b) (((uint8_t)a << 8) | (uint8_t)b)
      
        int index = 0;
        uint16_t uplow = (upper << 8) | lower;
        switch(uplow){
          case TW('a','a')  : index = 0; break;
          case TW('a','b')  : index = 1; break;
          case TW('a','f')  : index = 2; break;
          case TW('a','m')  : index = 3; break;
          ....
      Ответить
      • как я тебе буду вилкой чистить?
        int index = TW(upper, lower); // меня твои истории доебали уже
        Ответить
        • #define TW(a,b) (((uint8_t)(a) << 8) | (uint8_t)(b)) // Заветы макроебства - чтить!
          Ответить
          • Да я, в целом, немного о другом.

            А что такое SEIN 2004.04.01 KTJ?
            Ответить
            • Ну есть какой-то стандарт на то, какими двумя буквами какую страну обозначают https://github.com/fnp/librarian/blob/master/librarian/res/ISO-639-2_8859-1.txt#L59

              Что означает SEIN я понятия не имею. А KTJ это имя-фамилия корейского разраба из самсунга, который этот говнокод писал. Kwon TaeJin. [email protected]

              https://au.linkedin.com/in/eric-kwon-b129093
              https://kr.linkedin.com/in/eric-kwon-b129093
              Ответить
              • > есть какой-то
                Не какой-то, а ISO, причем не страну, а язык, и уже давно трёхбуквенные, т.к. 2 буквенных не хватат.
                А ещё есть ГОСТ (7.75-97, но и 7993-90 тоже был неплох, да), в котором догадались не только альфа, но и нумерик значения проставить языкам.

                Я в этом ключе и спросил что за нёх этот SEIN - вдруг у этих разрабов тоже перед глазами была таблица соответствий языка числу.
                Ибо так вот взять и перехуярить языки по порядку, чтобы потом патчить её номерами, сломав порядок, при этом не сославшись на некий стандарт, в котором уже эти номера присвоены - это одиозно.
                Ответить
            • http://read.pudn.com/downloads80/sourcecode/embed/311469/5009_RoCo_061107/COMMON/Common.c__.htm
              Ответить
            • SEIN это Samsung Electronics Indonesia судя по всему
              Ответить
            • Самсунг не знает ASCII таблицу
              NCHAR NumberToCharacter( UINT   number )   
              {   
                  NCHAR ch = '0';   
                 
                  switch( number )   
                  {   
                      case 0: ch = '0'; break;   
                      case 1: ch = '1'; break;   
                      case 2: ch = '2'; break;   
                      case 3: ch = '3'; break;   
                      case 4: ch = '4'; break;   
                      case 5: ch = '5'; break;   
                      case 6: ch = '6'; break;   
                      case 7: ch = '7'; break;   
                      case 8: ch = '8'; break;   
                      case 9: ch = '9'; break;   
                      default: break;   
                  }   
                  return( ch );   
              }
              Ответить
              • А разве Стандарт обещает, что кодировка совместима с Аской?
                Ответить
                • Эмм, что-то я очень-очень сомневаюсь, что на DVD-дисках где-то будет использоваться не основанная на ASCII кодировка.
                  Вообще, это хренота из утекшего исходника прошивки караоке-DVD проигрывателя, судя по всему модель Arirang 3600 HDD (для вьетнамского рынка). И хрень эта построена на самсунговском SoC S5H5002
                  Ответить
                • Удивительно, но даже в C89 не предъявляют никаких требований к кодировке даже исходного текста, только лишь предлагая, что в вашей кодировке исходников обязаны существовать вот такие символы ...
                  http://port70.net/~nsz/c/c89/c89-draft.html#2.2.1

                  Но In both the source and execution basic character sets, the value of each character after 0 in the above list of decimal digits shall be one greater than the value of the previous.
                  Т.е. вполне можно переписать на формулу if (number < 10) return number + '0'; else return '0';
                  Ответить
                  • > shall be one greater

                    но они ведь не определяют в каком именно числовом пространстве. `a + 1 + 1` не гарантировано будет больше чем `а`. ;-)
                    Ответить
                    • справедливо ли для твоего пространства (a + 1) + 1 == a + (1 + 1)?
                      Ответить
                      • в большинстве *моих* пространств - да. но кто знает какие пространства у стандартизаторов Ц в голове сидят ;-)

                        ЗЫ вроде же бы уже по определению даже уже групп - самая примитивная структура где сложение вводится - ассоциативность сложения доказывается тривиально.
                        Ответить
                        • Ну если да, тогда '0' + number даст верный ответ при любом number из [0..9], однозначно такой же, как если бы ты написал цикл, где прибавлял бы по единице.
                          Требование, чтобы a + 1 + 1 было гарантировано больше, чем а, избыточно.
                          Ответить
                          • а да ты прав. я только до трех посчитал. в каком Z(4), 3+1 = 0, что ломает требование что следуещее больше чем предыдущее.
                            Ответить
                      • не говоря уже о том - а что у них является единицей? может у них единица это тройка? или семерка? или они вообще неортодоксы алгебраичные, и единица у них это квадратный корень двойки??
                        Ответить
    • я бы сделал поиском в массиве.
      Ответить
      • двоичным надеюсь?

        (switch кстати компилятором оптимизируется в двоичный поиск при определенных условиях)
        Ответить
        • > двоичным надеюсь?
          Это зависит от размера массива. Если это критичное место, в чём я сильно сомневаюсь, я бы померил оба варианта и выбрал тот, что работает быстрее.
          Ответить
          • Да просто в мускуль все это сложить и селектить, а мускуль сам запросы соптимизирует!
            Ответить
          • > > двоичным надеюсь?
            > Это зависит от размера массива.

            еще зависит от того кто/как поддержку делает. как раз лукапы кодов стран/языков не раз видел что народ делает в лоб линейно.

            обоснование простое: список меняется слишком редко, народ забывает об ограничениях структуры данных, и почти каждый второй раз когда надо список обновить лажаются и допускают тривиальные ошибки.

            а так как лукапить в общем случае надо крайне редко - раз замапил и сохранил код - то никто и не оптимизирует.
            Ответить
            • >еще зависит от того кто/как поддержку делает. как раз лукапы кодов стран/языков не раз видел что народ делает в лоб линейно.

              >обоснование простое: список меняется слишком редко, народ забывает об ограничениях структуры данных, и почти каждый второй раз когда надо список обновить лажаются и допускают тривиальные ошибки.

              Так надо просто метапрограммирование (кодогенерацию) чтоб было так, что
              M_KEYVALUE(
              {
                {"aa", "AAR"},
                {"ab", "ABK"},
                {"af", "AFR"},
                {"am", "AMH"},
                {"ar", "ARA"},
                {"as", "ASM"}, // хотел бы я жить в стране Ассемблера
              ...

              и чтоб вот куда не добавь какую-нибудь {"hu", "HUI"} то чтоб компилтайм-метушня-кодогенератор потом все пересортировал и сам потом это упаковал сортированно в массив в компилтайме, и чтоб потом оно работало с двоичным поиском как положено, без багов и прочей хуйни. И чтоб гомоиконность!
              Ответить
              • https://en.wikipedia.org/wiki/Assam
                Индусы какие-то. Наверняка у них код - говно

                А назвать "ASS" они видимо не могли, потому что это ЗАД. Хотя вот субтитры ж так назвали...
                Ответить
              • > чтоб компилтайм-метушня-кодогенератор потом все пересортировал

                а на темплейтах+constexpr уже кто пробовал сортировку массивов в компайл тайм делать?

                какой то гений уже сваял на 14х крестах:
                https://stackoverflow.com/questions/19559808/constexpr-initialization-of-array-to-sort-contents

                еще один плюс новых крестов для встроенщины.
                Ответить
                • >а на темплейтах+constexpr уже кто пробовал сортировку массивов в компайл тайм делать?

                  >какой то гений уже сваял на 14х крестах:

                  Для этого не нужно быть никаким гением
                  http://govnokod.ru/19105#comment307900 мне еще очень давно Antervis сваял сортировку пузырьком на constexpr, ну я конечно же обоссал эту тупую хуйню

                  >еще один плюс новых крестов для встроенщины.

                  Это никакой не плюс, учитывая что я это же могу сделать кодогенерацией на Си через printf() или же вообще написать эту кодохуерацио на каком-нибудь питоне и присобачить к этому препроцессор свой.

                  Да и под нестандартную встроенщину плюсов обычно просто нет, а если и есть, то древнего стандарта
                  Ответить
                  • > учитывая что я это же могу сделать кодогенерацией на Си

                    можно. но на кой парится с кодогенерацией, если можно сделать стандартными средствами языка?

                    > Да и под нестандартную встроенщину плюсов обычно просто нет

                    это да. но на армах/кайлах есть. и IAR медленно уверенно прикручивает (с++14 для арма (v8.80) этой весной выпустили). глядишь через лет пять в проектах начнет появлятся.
                    Ответить
                    • >можно. но на кой парится с кодогенерацией, если можно сделать стандартными средствами языка?

                      Потому что стандартные средства языка C++ являются говном.

                      Ну вот представим себе ситуацию, допустим что есть у меня код некоторой встраиваемой СУБД, которая работает полностью в оперативной памяти(на глобальном массиве) того процесса, который эту СУБД использует. Есть функции, написанные на языке Си, которые в СУБД добавляют какие-то записи. У меня допустим программа должна при запуске уже содержать некие записи в этой СУБД.

                      Т.е. я не хочу каждый раз при запуске дергать кучу каких-то функций, которые бы добавляли мне в глобальный массив кучу нужных при старте записей(от этого программа дольше запускается), я просто хочу иметь уже проинициализированный в компилтайме глобальный массив с готовыми записями. Итак, что мне проще всего сделать:

                      1. Разбираться в логике работы СУБД, написать какой-то ебанины на C++14 которая бы инициализировала глобальный массив, и работала в компилтайме (при этом мне б пришлось вникать в код СУБД, и разбираться в каких-то кретинских плюсовых говноконстэкспрах и шаблонах, что мне вообще-то совершенно нафиг не всралось)

                      2. Сделать вспомогательную программу, которая бы на этапе сборки компилировалась, запускалась бы, и дергая много раз функцию добавления записи в БД, инициализировала бы в себе глобальный массив, и из него генерировала бы особый файл startdb.bin и который бы я мог потом конвертнуть в объектник и слинковать уже с основной программой, чтобы этот startdb.bin был виден как глобальный массив

                      ?
                      Ответить
                      • ты наверное никогда СУБД не программировал? потому что пример воняеееет.

                        я понимаю тебя. я как бы в той же самой луже сижу.

                        но мне просто радостно что наконец (через Н лет) мне не надо будет изгалятся и мучится с вызовами конструкторов (для статической инитиализации) перед мэйном. что наконец статическая инициализация на 100% статическая. и даже с роскошью компайл-тайм подготовки этих данных.
                        Ответить
                      • Не хочу никого обидеть (лол, конечно хочу), но вся эта ваша "встроенщина" само по себе дерьмо. Программисты калькуляторов рассуждают о высоких понятиях. Друзья, у меня в телефоне вычислительной мощи больше, чем в игровом ПК 15 лет назад. А вы тут байты экономите, потому что в 8 кококилобайт оперативной памяти кресты не влезают, тесно им в глобальных массивах, изображающих СУБД.
                        Как там, в 90х? Небось, тёлки молодые и пиво дешёвое?

                        З.Ы. Больше всего радует
                        > в кучах сэйфти и медикал областей
                        посмотрите сколько стоит мед. оборудование. Какого хуя вы экономите на CPU и RAM, если оно стоит как сука космолёт?
                        Ответить
                        • Мед. оборудование тоже разное бывает. Есть МРТ сканеры, которые и стоят как суко космолеты. Есть всякие измерители арт. давления, где каждый рубль себестоимости это 100 рублей твоей зарплаты
                          Ответить
                          • Да прост пичот.
                            В прошлом году заказывал у своего друга-железячника ("фуллстек" партия готовых изделий по заказанным характеристикам, плата прошивка питание корпус) некие сетевые смарт-девайсы. Сперва мне хотели рассказать, как заебись удобно мне ими будет управлять через modbus, ну максимум - modbus over udp, потом - про то, как код реализации стека tcp может не вместиться в выбранное ими железо (!!!), затем - ну бля, "ну какое удаленное обновление прошивки, ну какие две новые функции, чтобы так работало, надо было чип не за $1 покупать, а за $2". Это при цене-то одного девайса около $1k, да и задачи не стояло усраться в максимальный лоу-енд - так наэкономить на мозгах, чтобы было пиздец всем неудобно, и им, и нам, и никакого запаса.
                            Это в то время, как по PoE можно 30Вт слать, а аналогов raspberry pi с пердоликсом на борту и в тыщи раз большей памятью и мощью можно за $10-40 накупить, чтобы как сеалекса, хватило надолго!
                            Ответить
                            • ну блин, разумеется надо учитывать размер партии и стоимость разработки. Предположим, вам на партию в 1к устройств экономия на чипах - $1к. Сколько лишних девелоперо-часо-долларов сожрало отсутствие запаса? Вероятно, больше.

                              А ежели вы бы делали китайские игрушки, то там и девелоперо-часо-доллары другие, и размеры партий
                              Ответить
                    • > но на кой парится с кодогенерацией, если можно сделать стандартными средствами языка?
                      Лол. Если видишь шаблонную констекспр метушню там, где можно было обойтись скриптом на питоне - плюй автору в ебало смело. Единственное годное применение констекспров, приходящее на ум - парсинг строки формата и проверка типов аргументов в компайл-тайме в плюсовых аналогах принтфа.
                      Ответить
                      • Но слишком конечно тоже не стоит увлекаться. Конфиги, которые генерируют всякие автоконфы - это пиздец.
                        Ответить
                      • > Если видишь шаблонную констекспр метушню там, где можно было обойтись скриптом на питоне [...]

                        во первый, питон говно.

                        во вторых, но кой трахатся с чем то внешним, если это делается нативно на самом языке.

                        constexpr'ы это шаг в сторону решения проблемы инициализации перед мэйном. простыми кодогенераторами ты эту дырку не закроешь.

                        конкретный пример. в кучах сэйфти и медикал областей, стоят условия что вся память/объекты должны быть проинициализированы/этц перед использованием. на каких уёбищных микроконтроллерах, эта инициализация с легкостью может занимать почти секунду. и это при каждом запуске (которых может быть очень много, потому что энергию экономят тупым выключением). на constexpr'ах 95% этого оверхеда на буте можно избежать - и тем неменее гарантировать корректную инициализацию памяти.
                        Ответить
                        • >constexpr'ы это шаг в сторону решения проблемы инициализации перед мэйном. простыми кодогенераторами ты эту дырку не закроешь.

                          Простым может и не закроешь, а вот сложным - вполне.
                          Ответить
                        • > во первый, питон говно.
                          Да уж получше крестов или пердла.
                          Ответить
                        • >во первый, питон говно.

                          Ну, тут двояко. Как язык, питон мне кажется значительно меньшим говном, по сравнению с плюсами (но тоже говно). Но для решения конкретной описанной задачи он является примерно таким же говном, что и плюсы (если рассматривать стандартные плюсовые возможности метапрограммирования). Но если рассматривать возможности кодогенерации, плюсы уже немного меньшее говно, чем питон

                          Вот посудите: есть у вас какой-то код на Си, код этот напичкан какой-то хуйней, типа malloc, memcpy, указателееблей и прочей ебаниной, которая ничего общего с constexpr и шаблонной еблей не имеет. Перед вами стоит задача - этим кодом проинициализировать в компилтайме какие-то переменные, массивы, структуры. Так вот, по-моему для решения этой задачи оба языка являются полным говном, хотя плюсы в чем-то лучше. Нет, не тем, что constexpr и шаблоны, вы не подумайте. Просто можно написать кодогенератор на плюсах, но это к constexpr-шаблонной метушне никакого отношения вообще не имеет, с тем же успехом можно взять и Си. А у питона тупо нет совместимости на уровне исходного кода с Си

                          >во вторых, но кой трахатся с чем то внешним, если это делается нативно на самом языке.

                          Нативные средства метапрограммирования в плюсах являются полным говном, и кодогенерация намного лучше.
                          Ответить
                          • > Нативные средства метапрограммирования в плюсах являются полным говном []

                            да, они пахнут. но они решают реальнуе проблемы.

                            для каких ниш типа таблиц (со статическими данными) кодогенерация это абсолютно ОК. но для чего-то большего (то чем я больше/дольше всего страдал: C++ FSM генераторы) то там сложность кодогенераторов может быть выше чем сложность остального кода в проекте. и выхлоп генератора (и/или сам генератор) приходится тоже тестировать.

                            но если у тебя все сводится до пары десятков строк на змие, то я сомневаюсь что ты до (тёмных) высот кодогенерации доходил.
                            Ответить
                            • > то чем я больше/дольше всего страдал: C++ FSM генераторы

                              Попробуй Ragel
                              Ответить
                              • ragel - это экстрим. я делал кодогенераторы которые делали человеко-читаемых выхлоп, который можно спокойно еще и чек-ин-ить, потому что по FSM часто приходится в дебагере ходить. в добавок ragel заточен для парсинга, и выхлоп идет в одну функцию. для фсм мне нужно было "инлайн код" (мелкий код заданный в самой фсм) в генереные методы складывать, и их вызовы генерить.
                                Ответить
                                • Кстати да, плюсовую компилтайм-метушню (шаблоны, констэкспры, сишный препроцессор) уже придумали как дебагать? Например, если где-то в коде встречаются сразу три этих фактора (шаблоны, констэкспры, сишный препроцессор) не было ли случаев суицида на рабочем месте?
                                  Ответить
                                  • > констэкспры [...] как дебагать?

                                    ты что идиот? это дело резолвится *гарантировано* (иначе компайл ошибко) во время компайла.

                                    это как раз все и упрощает - нет ни какого замудрого эффекта в рантайме. все уже заэвалюировано и лежит в дата/ro-дата сегменте.
                                    Ответить
                                    • > ты что идиот?

                                      Нет

                                      >это дело резолвится *гарантировано* (иначе компайл ошибко) во время компайла.

                                      Если оно гарантировано во что-то отрезолвилось, еще никто не гарантирует что оно отрезолвилось в то, что нужно.

                                      Например, сишный препроцессор тоже гарантировано или что-то там раскроет, или не раскроет и выплюнет ошибку (или на этапе препроцессирования, или же компилятор не сможет прохавать ту хуйню, которая получилась после препроцессирования). Но "безошибочное" раскрытие всякой хуйни через сишный препроцессор совершенно не гарантирует отсутствие багов из-за раскрытия хуйния препроцессором. типичный пример это когда делается что-то вроде
                                      #define N1(a) a << 8

                                      и потом кто-то делает в коде
                                      c = N1(a)+b

                                      отчего возникает всякая хуйня, но никакой ошибки раскрытия макросни тут нет, с т.з. препроцессора и компилятора тут все корректно

                                      Да и констэксрпр-код разумеется может содержать какие-то БАГИ, и при вычислении констэкспров может получаться совсем не та хуйня, которую ожидал получить программист. Так вот, каким образом ДЕБАЖИТЬ ТАКОЙ КОМПИЛТАЙМ-БАГ? Куда брейкпоинт ставить?
                                      Ответить
                                      • > констэксрпр-код разумеется может содержать какие-то БАГИ

                                        да, но эти баги идентичны нормальным багам нормального крестового кода.

                                        о дополнительном типе багов - кривое определение макроса и его последствия - задумыватся не надо.

                                        > Так вот, каким образом ДЕБАЖИТЬ ТАКОЙ КОМПИЛТАЙМ-БАГ?

                                        еще раз специально для тормозов: для статических объектов, просто смотришься сегмент данных. если не умеешь в дизасме это, то просто стартуешь дебагер что бы в мэйне остановился, и смотришь сегмент данных.

                                        для не-статики, нет никакой разницы по сравнению с обычным нормальным кодом.
                                        Ответить
                                        • >еще раз специально для тормозов: для статических объектов, просто смотришься сегмент данных.

                                          ОК, допустим. Смотрю в сегмент данных. Вижу, что в сегменте данных какая-то хуйня, т.е. совсем не то, что мне нужно. Есть некая constexpr функция, которая вызывает другую constexpr функцию, которая в свою очередь вызывает третью, и там допустим есть всякие циклы в циклах, в общем есть некий нетривиальный constexpr код, который этот сегмент данных генерирует. Как мне его отдебажить? Как мне отследить выполнение (для тупых: сделать пошаговую отладку) этого constexpr говна
                                          Ответить
                                          • > Как мне его отдебажить?

                                            просто: убираешь constexpr и он магически-автоматически становится обычным кодом. та же семантика, тот же синтакс - только в одном слове различие.

                                            попробуй подобное с макросами проэмулировать.
                                            Ответить
                                            • > просто: убираешь constexpr и он магически-автоматически становится обычным кодом. та же семантика, тот же синтакс - только в одном слове различие.

                                              Т.е. мне надо глобальной автозаменой пройтись и убирать из всей цепочки этих constexpr функций ключевое слово constexpr? Ну просто заебись.

                                              И да, тут возникает новый вид жопы: предположим что я пишу хуйню под какой-нибудь говноконтроллер, и constexpr-параша считает синусы-тангенсы и инициализирует ими массив, и все синусы в рантайм-код тупо не влазят(недостаточно места на флеше говноконтроллера под всю ту хуйню), т.е. мне нужно эту constexpr-парашу делать не-constexpr и компилировать ДРУГИМ КОМПИЛЯТОРОМ ПОД ДРУГУЮ БЛЯДЬ АРХИТЕКТУРУ чтобы тупо отладить, да? Если это не пиздец, то что?
                                              Ответить
                                              • А если компилировать и отлаживать constexpr-парашу на другой архитектуре, то надо еще учитывать такие ебанутые моменты, как разный sizeof() и alingof() для разных типов, а еще и big-endian хуйню. В общем это просто полная жопа, если вдуматься.
                                                Ответить
                                              • это крайний случай, когда ты реально хочешь дебажить. Антервис тебе уже указал что можно глупыми статик ассертами юнит тесты делать.

                                                > т.е. мне нужно эту constexpr-парашу делать не-constexpr и компилировать ДРУГИМ КОМПИЛЯТОРОМ ПОД ДРУГУЮ БЛЯДЬ АРХИТЕКТУРУ чтобы тупо отладить, да? Если это не пиздец, то что?

                                                мля, как еслы бы нормальные юнит тесты когда либо в память говноконтроллера влазили. еще ни одного говноконтроллерного проекта не видел где бы 75% юнит тестов не на виндах делались. (потому что иначе и диагностики об ошибке иногда хер увидишь.)

                                                по-моему, ты просто ни разу и не пробовал конст-экспры, почему и психуешь здесь. конст-экспры это безобидная и полезная *опциональная* фича. для начала, просто попробуй.
                                                Ответить
                                                • >по-моему, ты просто ни разу и не пробовал конст-экспры, почему и психуешь здесь. конст-экспры это безобидная и полезная *опциональная* фича. для начала, просто попробуй.

                                                  Я вообще плюсы достаточно мало пробую. Мои попытки их серьезно попробовать обычно заканичватся тем, что я потом долго матерюсь в адрес тех, кто придумал весь этот маразм.
                                                  Что касается constexpr-ов, то их использование весьма ограничено. Код с какими-нибудь malloc/free и memcpy в них не засунуть, так что для меня, как сишника, эта фича практически бесполезна. А выкручивать себе руки и писать в каком-то недофункциональном стиле у меня нет никакого желания
                                                  Ответить
                                                  • > Мои попытки их серьезно попробовать обычно заканичватся тем, что я потом долго матерюсь в адрес тех, кто придумал весь этот маразм.
                                                    Расскажи подробнее про пару последних попыток. Что ты делал и что вызвало твои маты?
                                                    Ответить
                                                    • >Расскажи подробнее про пару последних попыток. Что ты делал и что вызвало твои маты?

                                                      Например надо сделать JIT какой-нибудь примитивный, и я хочу в компилтайме вызывать ассемблер, чтоб он мне прямо в массив проинициализировал опкоды. вот типа:
                                                      char *xor_eax_eax = asm_constexpr("xor eax, eax\n");
                                                      char *someshit = asm_constexpr(
                                                        "много всякой хуйни\n"
                                                        "написанной на асме\n"
                                                        "которая должна\n"
                                                        "быть в виде опкодов тут\n"
                                                        "проинициализирована в этом месте блядь\n"
                                                      )

                                                      и вот чтобы такую хуиту сделать, надо ассемблер переписывать нахуй весь на эти ебучие constexpr-ы, а я такой поебенью естественно заниматься не буду.

                                                      Или например хочу я сделать кучу функций по определенному правилу
                                                      double pow_0 (double a)
                                                      {
                                                        return 0;
                                                      }
                                                      
                                                      double pow_1 (double a)
                                                      {
                                                        return a;
                                                      }
                                                      
                                                      double pow_2 (double a)
                                                      {
                                                        return a*a;
                                                      }
                                                      
                                                      double pow_3 (double a)
                                                      {
                                                        return a*a*a;
                                                      }
                                                      
                                                      double pow_4 (double a)
                                                      {
                                                        return a*a*a*a;
                                                      }
                                                      
                                                      double pow_5 (double a)
                                                      {
                                                        return a*a*a*a*a;
                                                      }
                                                      
                                                      и так далее

                                                      Ясен хер, что подобная поебень в плюсах решается через т.н. шаблонное метапрограммирование. Ну ок, давайте напишем какую-то поебень на темплейтах
                                                      template <int Count>
                                                      struct Pow_t {
                                                          constexpr double operator()(double x)
                                                          {
                                                              return Pow_t<Count-1>()(x) * x;
                                                          }
                                                      };
                                                      
                                                      template <>
                                                      struct Pow_t<0> {
                                                          constexpr double operator()(double x)
                                                          {
                                                              return 1;
                                                          }
                                                      };
                                                      
                                                      template <int Count>
                                                      using pow = Pow_t<Count>;

                                                      А теперь мне надо сделать ебучий массив из указателей на функции
                                                      double (*govno[256])(double) = {
                                                        что за хуйню мне тут писать,
                                                        чтобы тут сука проинициализировались указатели на функции,
                                                        возводящие в степени от 0 до 255,
                                                        нагенерированные через говнотемплейт?
                                                      }; // и чтоб блядь без копипаста
                                                      Ответить
                                                      • > А теперь мне надо сделать ебучий массив из указателей на функции
                                                        http://ideone.com/OG2O1M
                                                        просто признай, что ты обычный неосилятор
                                                        Ответить
                                                        • > array<double(*)(double),256> arr = { &power<powers>... };

                                                          Эмм, что это за говно вообще? Я вроде бы просил нормальный статический массив, тут же я вижу только какой-то std::array.

                                                          #include <iostream>
                                                          #include <cmath>
                                                          #include <utility>
                                                          #include <array>
                                                           
                                                          using namespace std;
                                                           
                                                          template <int p>
                                                          double power(double val) {
                                                              return pow(val,p);
                                                          }
                                                           
                                                          template <size_t ...powers>
                                                          constexpr auto make_power_funcs(index_sequence<powers...>) {
                                                              array<double(*)(double),256> arr = { &power<powers>... };
                                                              return arr;
                                                          }
                                                           
                                                          constexpr auto power_funcs = make_power_funcs(make_index_sequence<256>());
                                                          
                                                          double (**a)(double) = power_funcs;

                                                          21 : <source>:21:11: error: no viable conversion from 'const std::array<double (*)(double), 256>' to 'double (**)(double)'
                                                          double (**a)(double) = power_funcs;
                                                          ^ ~~~~~~~~~~~
                                                          1 error generated.


                                                          что это за хуйня? Почему не работает?
                                                          Ответить
                                                          • если чуть-чуть головой подумать и абстрагироваться от мысли "сишка идеальна а все остальные языки говно", то std::array и есть "обычный статический массив". А вот хуета, которая неявно конвертится в указатель вместо того чтобы прыгнуть по значению (как коллекции в, наверно, всех остальных яп) - ничерта не массив. Хочешь конвертнуть в указатель - std::array::data() в помощь
                                                            Ответить
                                                            • >если чуть-чуть головой подумать и абстрагироваться от мысли "сишка идеальна а все остальные языки говно", то std::array и есть "обычный статический массив".

                                                              Во-первых, все языки (без исключения) говно. Во-вторых std::array это не статический массив в памяти, а какая-то блядь неведомая ебаная магия. А мне надо, чтоб все четко работало так, как я говорю

                                                              > Хочешь конвертнуть в указатель - std::array::data() в помощь

                                                              Попробовал - получилось какое-то откровенное говно

                                                              https://godbolt.org/g/GM6Nb3

                                                              double power<6>(double):
                                                                      movsd   xmm1, QWORD PTR .LC250[rip] // в .LC253 у нас число 5 в даблах
                                                                      jmp     pow // и тут мы блядь вызываем штатную функцию для возведения в степень
                                                              double power<5>(double):
                                                                      movsd   xmm1, QWORD PTR .LC251[rip] // в .LC253 у нас число 5 в даблах
                                                                      jmp     pow // и тут мы блядь вызываем штатную функцию для возведения в степень
                                                              double power<4>(double):
                                                                      movsd   xmm1, QWORD PTR .LC252[rip] // в .LC253 у нас число 4 в даблах
                                                                      jmp     pow // и тут мы блядь вызываем штатную функцию для возведения в степень
                                                              double power<3>(double):
                                                                      movsd   xmm1, QWORD PTR .LC253[rip] // в .LC253 у нас число 3 в даблах
                                                                      jmp     pow // и тут мы блядь вызываем штатную функцию для возведения в степень
                                                              double power<2>(double):
                                                                      mulsd   xmm0, xmm0
                                                                      ret

                                                              Тебе не кажется, что это немного не то, что мне надо получить? Что это вообще говоря ГОВНО?
                                                              Ну давай возьмем код типа...
                                                              https://godbolt.org/g/y9zV4r
                                                              Вот смотри как заебись, тут честно дергатся инструкция mulsd, и я даже скобочки блядь расставил, чтобы оно заебись заоптимизировалось.
                                                              Сравни код функции pow_8 и pow_8_govno (кстати, компилятор GCC сделает эти функции аналогичными, если включить флаг -funsafe-math-optimizations)
                                                              Ответить
                                                            • да кстати, попробуй там через темплейты нагенерить хуйни для возведения в степень, и чтоб скобочки оптимально расставлялись, а не тупым вызовом pow()
                                                              Ответить
                                                              • > Во-вторых std::array это не статический массив в памяти

                                                                кто тебе вообще сказал, что массив обязан быть статическим? Куда положил, там и лежит

                                                                > а какая-то блядь неведомая ебаная магия

                                                                N лежащих подряд элементов выбранного типа - неведомая магия?

                                                                > Что это вообще говоря ГОВНО?
                                                                Ты попросил pow_N, получил pow_N.

                                                                > да кстати, попробуй ... и чтоб скобочки оптимально расставлялись

                                                                Че пробовать-то, делать надо:
                                                                https://godbolt.org/g/iLpEuo
                                                                (на 256 No output: generated assembly was too large - 9 мб кода).
                                                                Ответить
                                                                • > N лежащих подряд элементов выбранного типа - неведомая магия?

                                                                  Лежащих где? Где-то "в астрале", да? Чтобы они реально где-то там начали лежать, надо использовать какую-то хуйню, типа std::array::data(). А как эта хуйня вообще устроена внутри? Если почитать исходники этого STL, там наверняка какой-то ебучий пиздец.

                                                                  > Че пробовать-то, делать надо:
                                                                  Не, так не пойдет. Попробуй обойтись без хуйни вида -funsafe-math-optimizations (представь что ты в говностудии компилируешь, где такой флаг отсутствует) но чтобы скобочки в умножении хуйни были таким образом расставлены, чтобы количество использованных mulsd инструкций для каждого случая было минимальным. Иными словами, в template нужно запрограммировать через какую-то жопу некую хуйню, которая бы находила наиболее оптимальный способ расставить скобочки в перемножении хуйни, чтобы количество умножений было наименьшим. Полагаться на какие-то нестандартные флаги компиляторов - говно.
                                                                  Ответить
                                                                  • Ну читни уже ман. std::array - это struct { T massiv[N]; }.
                                                                    Ответить
                                                                  • > Лежащих где? Где-то "в астрале", да?

                                                                    лежащих там, где положил, неужели это не очевидно? Компилятор выкидывает неиспользуемые constexpr значения, поэтому нужно обращаться к ним чтобы компилятор их не выкинул. Например, так:
                                                                    https://godbolt.org/g/NZdEkv

                                                                    > Если почитать исходники этого STL, там наверняка какой-то ебучий пиздец.

                                                                    ты у libfftw3/zlib и прочего тоже исходники читаешь вместо документации?
                                                                    Ответить
                                                                • И да, хотелось бы отдельно отметить, что -funsafe-math-optimizations не всегда дает оптимальнейший результат https://godbolt.org/g/mYNVAG
                                                                  Ассемблерный выхлоп для pow_18_trivial имеет на одну инструкцию больше, и это при включенной опции -funsafe-math-optimizations
                                                                  Если посмотреть ассемблерный выхлоп для этого же кода в Clang, то становится понятно, что Clang говно т.к. использует больше инструкций
                                                                  Ответить
                                                                • https://godbolt.org/g/dd8iZL - вот тут посмотри например pow_18_optim - такой вот результат нужен для 18 степени
                                                                  Ответить
                                                                  • господи, ты уже определись чего ты хочешь
                                                                    1) во всех вариантах, показанных Antervis, ты ВСЁ ЕЩЁ можешь перегрузить конкретные реализации шаблона и написать там хоть черта лысого - ровно так же, как и в сишечке во всех твоих примерах
                                                                    2) "хочу генерить это НАПИТОНе, у меня есть алгоритм как сделать минимальные разбиения" - ради бога, алгоритм наверняка целочисленный и самоочевидный, с несколькими ветвлениями - реализуй шаблонами вореции через static_if, направляй компилятор на разные пути шаблонных реализаций, внутри шаблонной реализации вызывай не N-1 калькуляцию (тривиал), а делай mymul<N/2>(a)*mymul<N/3>(a) и т.д.
                                                                    3) экономить 1 сука инструкцию, которая выигрывается только в сравнении с конкретной версией компилятора в конкретную фазу луны и набор ключей - да это пиздец, онанизм в предельной степени, займись делом уже
                                                                    Ответить
                                                                    • > экономить 1 сука инструкцию

                                                                      Кстати, насколько эта инструкция критична по сравнению с вызовом функции по указателю?
                                                                      Ответить
                                                                    • >1) во всех вариантах, показанных Antervis, ты ВСЁ ЕЩЁ можешь перегрузить конкретные реализации шаблона и написать там хоть черта лысого - ровно так же, как и в сишечке во всех твоих примерах

                                                                      НАХЕРА мне еботня с убогими кривыми шаблонами, если я могу использовать кодогенерацию, и не ебать себе мозг?

                                                                      >2) "хочу генерить это НАПИТОНе, у меня есть алгоритм как сделать минимальные разбиения" - ради бога, алгоритм наверняка целочисленный и самоочевидный, с несколькими ветвлениями - реализуй шаблонами вореции через static_if,

                                                                      НАХЕРА мне еботня с убогими кривыми шаблонами, если я могу использовать кодогенерацию, и не ебать себе мозг? Вся эта плюсовая шаблонная мета-ебля, чтоб сука оптимальнейшим образом скобочки расставить чтобы все неанскилльно считалось, она сука займет намного больше времени, чем если написать блядь кодогенератор для этой параши.

                                                                      > 3) экономить 1 сука инструкцию, которая выигрывается только в сравнении с конкретной версией компилятора в конкретную фазу луны и набор ключей - да это пиздец, онанизм в предельной степени, займись делом уже

                                                                      В других компиляторах (отличных сука от GCC) этот флаг или вообще недоступен, или нихера не оптимизирует так как надо. И там причин ебаться с расстановкой ебучих скобочек намного блядь больше https://godbolt.org/g/NqBAXk


                                                                      Вот было б заебись, если бы можно было с AST нормально напрямую работать, а не через кривое шаблонное говно и прочую ебанутую хуйню
                                                                      Ответить
                                                                      • > Вот было б заебись, если бы можно было с AST нормально напрямую работать, а не через кривое шаблонное говно и прочую ебанутую хуйню

                                                                        Вроде в расте можно писать плагины к компилятору и подсовывать их при сборке проекта вместе с сорцами, и это типа штатный способ писать продвинутую метушню у них. Хотя я точно не знаю.
                                                                        Ответить
                                                                      • надоел. Давай, напиши свой кодогенератор с оптимально расставленными скобками для всех случаев. А я допишу свою реализацию на меньшем объеме кода

                                                                        п.с. Одна инструкция ему дохуя, а реализация pow на 9 мб - это нормально.
                                                                        Ответить
                                                                      • > В других компиляторах (отличных сука от GCC) этот флаг или вообще недоступен, или нихера не оптимизирует так как надо. И там причин ебаться с расстановкой ебучих скобочек намного блядь больше https://godbolt.org/g/NqBAXk

                                                                        А теперь посмотри как твой же код выглядит в gcc 6.3 с теми же твоими флагами: https://godbolt.org/g/CY3anu
                                                                        Ты готов при каждой мажорной (минорной?) смене компилятора перелопачивать проекты на миллионы строк кода, чтобы перепроверить, не добавилась ли вшивая инструкция в твой охуенно "оптимизированный" кококод?
                                                                        Энивей, я вижу, что тебе нравится дрочить на работе. Так бывает, когда проекты не создают должный уровень челленджа, а времени (и гормонов) дохуя. Пройдет с возрастом. Ну или со сменой работы.
                                                                        Ответить
                                                                        • > Ты готов при каждой мажорной (минорной?) смене компилятора перелопачивать проекты на миллионы строк кода, чтобы перепроверить, не добавилась ли вшивая инструкция в твой охуенно "оптимизированный" кококод?

                                                                          Нет конечно. Мне такой хуйней заниматься нахуй не надо. Я просто пытаюсь на конкретных примерах показать ограниченность плюсового так называемого метапрограммирования, которое по факту является убогим говном, т.к. нет гомоиконности
                                                                          Ответить
                                                                        • Царь не меняет версию конпелятора без нужды, потому что он точно знает, какая версия лучше подходит под его нужды. А если меняет, то проводит исследования заново.
                                                                          Ответить
                                                      • Какое-то говно ты там делал. Каким образом это недостатки плюсов?

                                                        Вот тебе скрипт в помощь:
                                                        #!/usr/bin/env python
                                                        # encoding: utf-8
                                                        
                                                        
                                                        print "double pow_0(double) { return 0; }"
                                                        
                                                        for i in xrange(1, 256):
                                                            print "double pow_%d(double a) { return %s; }" % (i, '*'.join('a' * i))
                                                        
                                                        
                                                        print "double (*govno[256])(double) = {"
                                                        
                                                        for i in xrange(0, 256):
                                                            print "&pow_%d," % i
                                                        
                                                        print "}"


                                                        Алсо, x**0 = 1, если что.
                                                        Ответить
                                                        • А встроить этот скрипт в систему сборки еще столько же кода, если не больше.
                                                          Ответить
                                                          • Еще столько же мало?
                                                            FIND_PACKAGE(PythonInterp 2.7 REQUIRED)
                                                            
                                                            ADD_CUSTOM_COMMAND(
                                                                OUTPUT "${PROJECT_SOURCE_DIR}/zalupa.cpp"
                                                                COMMAND ${PYTHON_EXECUTABLE} gen_zalupa.py
                                                                VERBATIM
                                                            )
                                                            Ответить
                                                            • системы сборки разные бывают, не только cmake. Еще в какой-нибудь jenkins-файл дописывать установку питона (win).
                                                              Ответить
                                                              • Меня не волнуют проблемы холопов. Скрипт на питоне в 100500 раз понятнее и проще того, что ты там выше написал.
                                                                Ответить
                                                        • >Какое-то говно ты там делал. Каким образом это недостатки плюсов?

                                                          Таким, что надо делать хуйню на питоне или другой хуйне, а встроенные средства плюсов - говно
                                                          Ответить
                                                          • Ну я серьезно спросил, думал, у тебя какие-то реальные проблемы были, а ты какую-то дичь в ответ задвигаешь.
                                                            Ответить
                                                            • Реальные проблемы это убогость средств метапрограммирования в плюсах и необходимость использования внешней хуйни для чего-то нетривиального
                                                              Ответить
                                                • > мля, как еслы бы нормальные юнит тесты когда либо в память говноконтроллера влазили

                                                  Говноконтроллер можно отдебажить на реальном железе внутрисхемной отладкой. А ассерты оттранслировать в какие-нибудь брейкпоинты в особо интересных местах.

                                                  >еще ни одного говноконтроллерного проекта не видел где бы 75% юнит тестов не на виндах делались

                                                  Это реально только если только всю говнопериферию эмулировать, которая к контроллеру цепляется
                                                  Ответить
                                                • > где бы 75% юнит тестов не на виндах делались.

                                                  И да, отдельная порция говна лично от меня. Для тех, кто свои компиляторы-говноSDK для контроллеров делает исключительно под винду
                                                  Ответить
                                            • > просто: убираешь constexpr и он магически-автоматически становится обычным кодом

                                              Зачем? Если на вход constexpr функции передать runtime-значения, она выполнится как обычная
                                              Ответить
                                      • constexpr и шаблоны можно юнит-тестить простыми static_assert'ами.
                                        Ответить
                                        • > юнит-тестить простыми static_assert'ами
                                          И что самое замечательное, результат такого теста видно прямо в IDE. Даже компилить не надо.
                                          Ответить
                        • https://youtu.be/FcCymlVAtP8?t=2982 вот немного бреда про constexpr-хуиту
                          Ответить
                      • чтобы потом сборка проекта из "make && make install" превратилась в "установите 15 хуютилит, пропишите 20 путей в PATH, убедитесь что есть подключение к сети и продайте сына в рабство, потом можете собирать"
                        Ответить
                        • Пускай лучше так, чем городить огород на метушне.

                          > make && make install
                          Вменяемые люди голые мейкфайлы сейчас не пишут.

                          > установите 15 хуютилит
                          Питон есть везде, кроме разве что винды, которая нинужна.
                          Ответить
                          • да, под линуксом проще. Но что делать если софтинка нужна еще и плебеям? Плюс, даже в линухе те или иные зависимости надо ставить. Каких-то определенных пакетов (того же питона) в стандартной поставке может попросту не быть.

                            Чем проще процесс сборки, тем реже приходится дергать девопса при внесении изменений. А система сборки может быть любой, лишь бы собирала просто
                            Ответить
                            • поэтому для виндов проще кодогенерацию на том же ц/крестах делать.

                              как ветеран кодогенерации, я думаю что фанатизм sos & j123 заключается в том что они только что для себя её (кодогенерацию) открыли. кодогенерация == хорошо. фанатизм == плохо.

                              т.к. они питон тут пихают, они может сконсом пользуются. тогда там да прямо в билд можно кодогенерацию в пихнуть, что есть очень удобно.
                              Ответить
                              • Как адвокат, я думаю, что ты недостаточно меня знаешь, чтобы что-то обо мне думать.
                                Но раз уж мы заговорили о моей личности, то нет, я не фанат кодогенерации (единственное что генерирует у меня код - это протобуф). Я фанатично ненавижу крестовую метушню и всех этих программистишек, которые пишут нечитаемые компилирующиеся по полчаса портянки на этой метушне. И нет, я не хейчу с++. Я профессиональный крестушок и дошел до жизни такой не от того, что больше ничего не умею.

                                > может сконсом пользуются
                                Питон можно вызвать из любой системы сборки. Конкретно я пользуюсь симейком.
                                Ответить
                  • не обоссал, а обоссался*
                    Ответить
                • > а на темплейтах+constexpr уже кто пробовал сортировку массивов в компайл тайм делать?

                  Зачем сортировку-то писать? Достаточно при сборке проверять, что массив отсортирован, это делается относительно просто через constexpr функцию и static_assert. Пущай людишки руками сортируют (ну как руками — M-x sort-lines). Кмк, лучше видеть вещи в сорцах такими, какими они должны быть.
                  Ответить
                  • > Кмк, лучше видеть вещи в сорцах такими, какими они должны быть.

                    в общем случае да. и я не против так же в ран-тайме в инициализации сортировать, но народ на это жалуется, потому что все пытаются такого типа данные конст делать.

                    но с другой стороны, в таблицы языков/стран/локалей/кодировок/часовых поясов настолько редко надо смотреться, что народ реально забывает (или люди работы поменяли) как новый элемент добавлять. поэтому "проще - лучше" это тоже решение.

                    это даже случалось официальной таблицой часовых поясов. много лет ничего не менялось - автор сам забыл формат. сдвинули часовой пояс для острова на пол часа. но криво. и какой-то там мелкий остров в океании только через Н лет догадался что смена пояса совсем не прошла: потому что звонки и банковские платежи изредка на неправильный день бухались.
                    Ответить
                  • у нас в одном проекте есть табличка синусов/косинусов. Хорошо б её в constexpr, да она 64 мегабайта весит, а библиотека - 1 мб. При этом размер библиотеки важен
                    Ответить
                    • Я_ничего_не_понял.jpg. Можно поподробнее?
                      Ответить
                      • да типа пример из жизни. Круто бы на constexpr сделать, но +64 мб места жалко
                        Ответить
                        • Ну т.е. размер таблица увеличивается в 64 раза, если вынести её в компайл-тайм? Почему так получается?
                          Ответить
                          • еще раз. Сейчас вся библиотека 1 мб. Если таблицу посчитать на constexpr, библиотека будет весить 64. А так она просто в рантайме на этапе инициализации считается
                            Ответить
                            • Это я понял, я и спрашиваю, откуда берутся эти 63мб.
                              Ответить
                              • Ну, вероятно, в рантайм-варианте таблица выделяется в куче, и там её библиотека инициализирует значениями.
                                А в компайл-тайм варианте надо все эти посчитанные значения зашить в сегмент, который будет предоставлять глобальную таблицу.
                                Если они там под калькулятор пишут (для управления торсионными МБР, иначе зачем нужна таблица косинусов), то лишние 64МБ загружаемой прошивки - это болезненно. Да даже по интернетам распространять - 64МБ на дороге не валяются.
                                Ответить
                                • Всё, понял. Т.е. 64 мб никуда не делись, просто сейчас они не в .text, а в хипе.
                                  Я просто думал, что таблица статически выделена, но от переноса в constexpr она увеличивается в размерах в 64 раза.
                                  Ответить
                                  • >Всё, понял. Т.е. 64 мб никуда не делись, просто сейчас они не в .text, а в хипе.

                                    Это еще почему? Зачем в хипе? Можно и в .bss
                                    Ответить
                                    • На самом деле в любом сегменте может быть инициализированная часть (которая присутствует в экзешнике) и неинициализированная (которая создаётся во время загрузки экзешника). Просто обычно у .bss инициализированная часть пуста, а у .text — неинициализированная часть пуста.
                                      Ответить
                                • Какая в пизду прошивка???? Это тут при чем????
                                  Ответить
                                • >Если они там под калькулятор пишут (для управления торсионными МБР, иначе зачем нужна таблица косинусов), то лишние 64МБ загружаемой прошивки - это болезненно.

                                  Да ну, всегда можно придумать какой-нибудь хитрожопый обходной маневр. Например, есть устройство с 128 мб ПЗУ. Под какую-то говнотаблицу синусов надо 64 мегов. Сама прошивка без таблицы синусов занимает скажем 32 мегабайта. Да тогда все просто. Делаем прошивку, которая без таблицы синусов но с хуитой чтобы считать синусы программно, через CORDIC или другое говно, типа всяких рядов Тейлора. Прошивка зашивается в целевое устройство, занимает она скажем 32 мегабайта + еще немного на эту функцию-считалку синуса. Сразу же после заливки прошивки, на самом прошитом устройстве запускается хуита, которая считает синус, и которая в ПЗУ память заносит это табличное говно с синусами, после чего эта функция для считания синуса больше никогда и не используется, а используется только та таблица, которая была проинициализирована в ПЗУ сразу после прошивки. Вот и все.
                                  Ответить
                                  • Мне кажется, что на размер файла с прошивкой всем похуй (а на апдейте можно заливать только нужные куски). Програматор зальёт эту таблицу синусов быстрее и надежнее.
                                    Ответить
                                    • Когда-то давно, на одной из моих старых работ, я был в т.ч. тем самым чуваком, который писал софт для девайсов в метро и автобусах, что поездки списывают. На старых девайсах был мотороловский проц из 90х, от 512k до 2M ROM. Так вот пока с программатора эти несчастные полмега зальются, можно охуеть. Ещё больше можно было охуеть при удаленном обновлении софта - когда софт (пусть в 2 раза меньший по объему, т.к. дрова не апдейтились) заливался по rs-485 на 9600 бод.
                                      Парк - несколько тысяч девайсов. Так что на 64 мега нет, не похуй.
                                      Потом девайсы, слава богу, отмодернизировали до прельстивого x86 с пердоликсом, кучей рам, диска и сетью (и стало возможно хуярить всё на бусте), но осадочек остался.
                                      Ответить
      • все делают. потому что такие свитчи занимают слишком много кода.
        Ответить
    • Чую запах свежего поноса из ноздри
      Ответить
      • +1

        Я уже давно пролистываю эту поеботень (вореции) "как пропатчить МБР под 64кб на хуетино в компалтайме рантайма с констэкспрами"
        Ответить
        • Ребят, есть инсайт с брифинга в мейле. Они проводили рисерч на фокус-группах. Есть реальный деманд у пользователей, но какой – пока секрет. У меня по теме четкий вижен, кофаундер оч сильный продакт с бекграундом в фандрайзинге. Воркфлоу прописан. Ищу диза, чтобы запилить первую итерацию для эмвипи. Дедлайн – вчера, так что реальный челлендж прокачаться в скорости. Если с фидбека ловим вау-еффект, то сразу идем в диджитал-медиа, набираем велосити и становимся ключевым вендором. Деманды по кипиай уже есть, на запуске режем косты, поэтому платить не смогу. Как только закроем чекпоинт с аккаунт-планированием, сразу пойдет бабло. Вероятность факапа минимальна. Го?
          Ответить
        • Кот Василий взял весенний отпуск – жениться. Скоро в Соловце опять объявятся говорящие котята с наследственно-склеротической памятью.

          Луи Седловой из отдела Абсолютного Знания изобрёл какую-то машину времени и сегодня будет докладывать об этом на семинаре.

          В институте снова появился Выбегалло. Везде ходит и хвастается, что осенён титанической идеей. Речь многих обезьян, видите ли, напоминает человеческую, записанную, значить, на магнитофонную плёнку и пущенную задом наперёд с большой скоростью. Так он, эта, записал в сухумском заповеднике разговоры павианов и прослушал их, пустив задом наперёд на малой скорости. Получилось, как он заявляет, нечто феноменальное, но что именно – не говорит.

          В вычислительном центре опять сгорел «Алдан», но Сашка Привалов не виноват, виноват Хунта, который последнее время из принципа интересуется только такими задачами, для которых доказано отсутствие решения.

          Престарелый колдун Перун Маркович Неунывай-Дубино из отдела Воинствующего Атеизма взял отпуск для очередного перевоплощения.

          В отделе Вечной Молодости после долгой и продолжительной болезни скончалась модель бессмертного человека.

          Академия наук выделила институту энную сумму на благоустройство территории. На эту сумму Модест Матвеевич собирается обнести институт узорной чугунной решёткой с аллегорическими изображениями и с цветочными горшками на столбах, а на заднем дворе, между трансформаторной будкой и бензохранилищем, организовать фонтан с девятиметровой струёй. Спортбюро просило у него денег на теннисный корт – отказал, объявив, что фонтан необходим для научных размышлений, а теннис есть дрыгоножество и рукомашество…

          Стругацкие. Понедельник начинается в субботу.
          Ответить

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