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

    +129

    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
    #include <stdio.h>
    #include <stdint.h>
    
    #define ARR_L 11
    #define INS_P (arr[0])
    #define MOD_L(a) ((a) % ARR_L)
    #define INS_P_M (MOD_L(INS_P))
    #define ARR_ACS(a) (arr[MOD_L(a)]) //access to arr
    
    
    void foo (uint8_t *arr)
    {
      ARR_ACS(3) = INS_P * ARR_ACS(INS_P);
      ARR_ACS( MOD_L( INS_P_M + 1 ) ) = ((INS_P * INS_P) * 2);
      if (INS_P != 0) {ARR_ACS(INS_P_M)++;};
      INS_P = INS_P_M + 1;
    
      // tut voobche lubaya fignya, kotoraya chtoby izmenyala
      // figny v massive v zavisimosti ot sostoyania massiva
    }
    
    int main(void) {
      uint8_t arr[ARR_L] = {0,2,6,3,2,62,7,113,0,26,13};
      for (size_t a = 0; a < 10000; a++)
      {
        foo(arr);
        printf 
        (
          "%.3u %.3u %.3u %.3u %.3u "
          "%.3u %.3u %.3u %.3u %.3u %.3u\n",
          INS_P,arr[1],arr[2],arr[3],arr[4],
          arr[5],arr[6],arr[7],arr[8],arr[9],arr[10]);
      }
      return 0;
    }

    Машина Тьюринга с лентой конечной длины - конечный автомат. Состояние обязательно зациклится, какие бы правила преобразования над конечным алфавитом мы не вводили и каким бы ни было начальное состояние ленты.

    В сишке есть возможности вменяемо сделать вывод чисел из массива подряд для N-ного количества аргументов?
    Цикл не предлагать

    Запостил: j123123, 12 Мая 2014

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

    • В сишке есть возможности вменяемо сделать вывод чисел из массива подряд для N-ного количества аргументов?
      Цикл не предлагать

      Рекурсия не?
      Ответить
      • Рекурсия это как цикл. Одно сводится к другому
        Ответить
        • написать вспомогательную функцию религия не позволяет?

          и чем цикл тебе плох?
          Ответить
          • Проблема в том, что это много вызовов функции printf, оверхед
            Ответить
            • printf же через буфер выводит. Если не флашить stdout, то все должно быть достаточно быстро.
              Или у тебя какие-то особые требования к производительности?
              Ответить
              • Хочу удобно создавать в компилтайме функцию, делающую количество принтф-ов, которое известно в компилтайме
                Ответить
              • Точнее, мне нужно нечто такое, чему я говорю, make_me_printfs( 7 )
                И оно делает printf("%.3u %.3u .....", a[0], a[1], a[2] ....) нужное число раз
                Или чтобы вообще генерировало сишный код специальной функции которая именно семь раз выводит из массива такую-то фигню...
                Ответить
                • Ц препроцессор не поддерживает арифметики и flow control. обломись. это тебе к лисповцам и тцл-щикам. там можно кодо-генерить чё хочешь.

                  в реальной жизни, буферизированого stdio вполне хватает.
                  Ответить
                  • Я лучше каким-нибудь M4 обмажусь. Я вообще хочу свой ЯП изобрести и сделать раскрутку компилятора (ага, мне делать нефиг)
                    Ответить
                    • ну нынче это не так уж и сложно:
                      http://llvm.org/docs/tutorial/

                      может есть нечто подобное для clang'а, но я не в курсе.
                      Ответить
                  • Короче, хочу такую-то гомоиконную байтоебскую со строгой статической типизацией сишку
                    Ответить
                    • http://claylabs.com/clay/
                      Ответить
                    • Гомоиконных фортраноподобных языков не может быть по определению (т.как в доисторические времена, люди которые планировали Алгол считали, что язык должен состоять из трех уровней, "машинного кода", т.е. непосредственно набора инструкций, "обобщенного представления", т.е. непосредственно правил языка, "конкретных интерпретаций" правил языка, например, локализаций, экстрапозиций и т.д.)
                      Фортраноподобные языки, это языки на уровне "конкретных интерпретаций". А раз уж они там, то возникает резонный вопрос: если бы они были такими же, как и правила, которые они интерпретируют, то в чем заключается эта интерпретация?
                      (Это не вдаваясь в дискуссии по поводу необходимости третьего уровня, его назначения)
                      Ответить
                  • > Ц препроцессор не поддерживает арифметики и flow control
                    А как же BOOST_PP? :) Там и циклы и условия и даже арифметика (примитивная, в ограниченном интервале).

                    На нем вполне можно высрать нужный j123123 код.
                    Ответить
                    • Хотели сишкоблядских макросов - нате:
                      #define ARR_L 3
                      
                      #define P1(z, n, d) BOOST_PP_IF(BOOST_PP_EQUAL(n, 0), ," ") "%.3u"
                      #define P2(z, n, d) ,d[n]
                      #define PRINT_ARRAY(a, n) printf(BOOST_PP_REPEAT(n, P1, ~) BOOST_PP_REPEAT(n, P2, a))
                      
                      int arr[ARR_L];
                      PRINT_ARRAY(arr, ARR_L); // printf( "%.3u" " " "%.3u" " " "%.3u" ,arr[0] ,arr[1] ,arr[2]);
                      Ответить
                      • Ну а вообще - задумываться о пирфомансе и юзать printf... Там же внутри принтфа есть ненавистный тебе цикл, да еще и парсинг строки формата. Если хочешь пирфоманса - байтоёбь вывод сам.
                        Ответить
                        • Так я байтоебил свой преобразоватор из двоички в десятичную систему счисления, надо только как следует заоптимизировать и переписать на ассемблер
                          Ответить
                          • царь ты?
                            Ответить
                          • > как следует заоптимизировать и переписать на ассемблер
                            И время исполнения этой функции как было ничтожным по сравнению со временем записи на диск или передачи в эмулятор терминала, так и останется...

                            Или ты эту прогу только на рамдиске гоняешь?
                            Ответить
                            • Может и в рамдиске. Поназаписывать граф состояний в память, потом дампать на диск, когда оперативка закончилась
                              Ответить
                              • Ну один хер ты все это посмотреть глазами не сможешь...

                                Поэтому сохраняй все в двоичном, не трахаясь с оптимизацией десятичного вывода. А когда захочется что-то посмотреть - сконвертишь нужный фрагмент в человекочитаемый вид.
                                Ответить
                                • Можно потом визуализировать в виде большой картинки
                                  Ответить
                                  • > Можно потом визуализировать в виде большой картинки
                                    Ну тогда сам бог велел писать в двоичном. Сэкономишь кучу тактов на парсинге ;)
                                    Ответить
                            • Самопальная буферизация. Буферизуем состояния в двоичной системе счисления. Когда буфер закончился, весь зафигаченый в ОЗУ буфер переводим в циферки и выводим куда-нибудь в файл, например
                              Ответить
                        • но буст ведь кресто-библиотека!?

                          тем кто байто-трубациями занимаются, не к лицу.
                          Ответить
                          • BOOST_PP - не крестобиблиотека. Там не то что крестоблядств нет, там нету даже ни одной строчки сишного кода. Только сишные(!) комменты, только директивы препроцессора, только хардкор.
                            Ответить
                            • я тебе не верю. там даже в имени написано "boost"!
                              Ответить
                              • http://svn.boost.org/svn/boost/trunk/boost/preprocessor/arithmetic/inc.hpp
                                Ответить
                                • во! даже в имени - .hpp - кресты проглядваются!

                                  PS я знаю что такое bost_pp.
                                  Ответить
                • В Сишке или в плюсах? В плюсах это будет выглядеть как-то так:

                  #include <iostream>
                  using namespace std;
                  
                  template <int n>
                  void print_array_impl(ostream& os, int* arr, int sz) {
                          print_array_impl<n - 1>(os << arr[sz - n] << " ", arr, sz);
                  }
                  
                  template <>
                  void print_array_impl<0>(ostream& os, int* arr, int sz) {
                          os << endl;
                  }
                  
                  template <int n>
                  void print_array(int* arr) {
                          print_array_impl<n>(cout, arr, n);
                  }
                  
                  int main() {
                          int arr[7] = {0, 1, 2, 3, 44, 45, 46};
                  
                          print_array<7>(arr);
                  
                  
                          return 0;
                  }


                  g++ все развернул внутри main
                  Ответить
                  • Хрень какая-то. Не по нраву
                    Ответить
                    • > Хрень какая-то. Не по нраву
                      Ультимативный аргумент в технологическом споре!
                      Ответить
                  • Шаблоны не такие, как Си. Нет гомоиконности. А я хочу гомоиконности. И нет, плюсы мне не нужны
                    Ответить
                    • > Нет гомоиконности. А я хочу гомоиконности.
                      Слова не мальчика, но... доктора наук из клуба wvxvw.
                      Ответить
                    • cleaned
                      Ответить
                      • ………………..,-~*’`¯lllllll`*~, …………..,-~*`lllllllllllllllllllllllllll¯`*-, ………,-~*llllllllllllllllllllllllllllllllllllllllllll*-, ……,-*llllllllllllllllllllllllllllllllllllllllllllllllllllll.\ ….;*`lllllllllllllllllllllllllll,-~*~-,llllllllllllllllllll\ …..\lllllllllllllllllllllllllll/………\;;;;llllllllllll,-`~-, ……\lllllllllllllllllllll,-*………..`~-~-,…(.(¯`*,`, …….\llllllllllll,-~*…………………)_-\..*`*;..) ……..\,-*`¯,*`)…………,-~*`~.……………/ ………|/…/…/~,……-~*,-~*`;……………./.\ ……../…/…/…/..,-,..*~,.`*~*…………….*…\ …….|…/…/…/.*`…\………………………)….)¯`~, …….|./…/…./…….)……,.)`*~-,…………/….|..)…`~-, ……/./…/…,*`-,…..`-,…*`….,---……\…./…../..|………¯```*~- ……(……….)`*~-,….`*`.,-~*.,-*……|…/.…/…/…………\ …….*-,…….`*-,…`~,..``.,,,-*……….|.,*…,*…|……\ ……….*,………`-,…)-,…………..,-*`…,-*….(`-,…
                        Ответить
                        • ┈╭━━━━━━━━━━━╮┈
                          ┈┃╭━━━╮┊╭━━━╮┃┈
                          ╭┫┃┈▇┈┃┊┃┈▇┈┃┣╮
                          ┃┃╰━━━╯┊╰━━━╯┃┃
                          ╰┫╭━╮╰━━━╯╭━╮┣╯
                          ┈┃┃┣┳┳┳┳┳┳┳┫┃┃┈
                          ┈┃┃╰┻┻┻┻┻┻┻╯┃┃┈
                          ┈╰━━━━━━━━━━━╯┈
                          Ответить
                          • ________¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶__________
                            ______¶¶¶¶¶¶_____________¶¶¶¶¶¶________
                            _____¶¶¶¶¶_________________¶¶¶¶¶¶______
                            ____¶¶¶¶_____________________¶¶¶¶¶_____
                            ___¶¶¶¶_______________________¶¶¶¶¶____
                            __¶¶¶¶_____¶¶¶________¶¶¶¶______¶¶¶____
                            __¶¶¶_______¶¶¶______¶¶¶¶¶¶_____¶¶¶¶___
                            _¶¶¶¶________¶¶¶_____¶¶¶¶¶¶______¶¶¶___
                            _¶¶¶__________¶¶¶_____¶¶¶¶_______¶¶¶¶__
                            _¶¶¶______________________________¶¶¶__
                            _¶¶¶______________________________¶¶¶__
                            _¶¶¶____¶¶_________________¶¶_____¶¶¶__
                            _¶¶¶____¶¶¶________________¶¶_____¶¶¶__
                            _¶¶¶¶____¶¶¶______________¶¶¶_____¶¶¶__
                            __¶¶¶____¶¶¶_____________¶¶¶_____¶¶¶¶__
                            __¶¶¶¶____¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶_____¶¶¶¶___
                            __¶¶¶¶_______¶__¶__¶____________¶¶¶¶___
                            ___¶¶¶¶______¶__¶__¶___________¶¶¶¶____
                            ___¶¶¶¶______¶_____¶___________¶¶¶¶____
                            ____¶¶¶¶______¶¶¶¶¶___________¶¶¶¶_____
                            _____¶¶¶¶___________________¶¶¶¶_______
                            ______¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶________
                            ________¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶__________
                            Ответить
                            • ░░░░░░░░░░░███████░░░░░░░░░░░
                              ░░░░░░░████░░░░░░░████░░░░░░░
                              ░░░░░██░░░░░░░░░░░░░░░██░░░░░
                              ░░░██░░░░░░░░░░░░░░░░░░░██░░░
                              ░░█░░░░░░░░░░░░░░░░░░░░░░░█░░
                              ░█░░████░░░░░░░░██████░░░░░█░
                              █░░█░░░██░░░░░░█░░░░███░░░░░█
                              █░█░░░░░░█░░░░░█░░░░░░░█░░░░█
                              █░█████████░░░░█████████░░░░█
                              █░░░░░░░░░░░░░░░░░░░░░░░░░░░█
                              █░░░░░░░░░░░░░░░░░░░░░░░░░░░█
                              █░░░████████████████████░░░░█
                              ░█░░░█▓▓▓▓▓▓▓▓█████▓▓▓█░░░░█░
                              ░█░░░░█▓▓▓▓▓██░░░░██▓██░░░░█░
                              ░░█░░░░██▓▓█░░░░░░░▒██░░░░█░░
                              ░░░██░░░░██░░░░░░▒██░░░░██░░░
                              ░░░░░██░░░░███████░░░░██░░░░░
                              ░░░░░░░███░░░░░░░░░███░░░░░░░
                              ░░░░░░░░░░█████████░░░░░░░░░░
                              Ответить
                              • ───────▄▀▀▀▀▀▀▀▀▀▀▄▄
                                ────▄▀▀░░░░░░░░░░░░░▀▄
                                ──▄▀░░░░░░░░░░░░░░░░░░▀▄
                                ──█░░░░░░░░░░░░░░░░░░░░░▀▄
                                ─▐▌░░░░░░░░▄▄▄▄▄▄▄░░░░░░░▐▌
                                ─█░░░░░░░░░░░▄▄▄▄░░▀▀▀▀▀░░█
                                ▐▌░░░░░░░▀▀▀▀░░░░░▀▀▀▀▀░░░▐▌
                                █░░░░░░░░░▄▄▀▀▀▀▀░░░░▀▀▀▀▄░█
                                █░░░░░░░░░░░░░░░░▀░░░▐░░░░░▐▌
                                ▐▌░░░░░░░░░▐▀▀██▄░░░░░░▄▄▄░▐▌
                                ─█░░░░░░░░░░░▀▀▀░░░░░░▀▀██░░█
                                ─▐▌░░░░▄░░░░░░░░░░░░░▌░░░░░░█
                                ──▐▌░░▐░░░░░░░░░░░░░░▀▄░░░░░█
                                ───█░░░▌░░░░░░░░▐▀░░░░▄▀░░░▐▌
                                ───▐▌░░▀▄░░░░░░░░▀░▀░▀▀░░░▄▀
                                ───▐▌░░▐▀▄░░░░░░░░░░░░░░░░█
                                ───▐▌░░░▌░▀▄░░░░▀▀▀▀▀▀░░░█
                                ───█░░░▀░░░░▀▄░░░░░░░░░░▄▀
                                ──▐▌░░░░░░░░░░▀▄░░░░░░▄▀
                                ─▄▀░░░▄▀░░░░░░░░▀▀▀▀█▀
                                ▀░░░▄▀░░░░░░░░░░▀░░░▀▀▀▀▄▄▄▄▄
                                Ответить
                          • Годно.
                            Ответить
                  • > print_array<7>(arr);
                    фу, на шаблонах можно и print_array(arr); замутить
                    Ответить
    • > INS_P = INS_P_M + 1;

      да. гарантировано зациклится.
      Ответить
      • Надо было INS_P = MOD_L(INS_P_M + 1);

        // хотя там пофиг, ибо везде ARR_ACS используется, который срезает
        Ответить
    • > В сишке есть возможности вменяемо сделать вывод чисел из массива подряд для N-ного количества аргументов?
      http://sourceware.org/gdb/onlinedocs/gdb/Arrays.html
      Ответить

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