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

    +162

    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
    // © Код Арсения
    #include <stdio.h>
    #include <conio.h>
    #define N 100
    int n,kol=1;  //одекватен до 6!
     
    void SAW(int *a,int *b)
    {
        *a-=*b;
        *b+=*a;
        *a=*b-*a;
         kol=kol+1;
    }
    
    void deduction(int A[])
    {
        int i;
        printf(" %5d : ",kol);
        for (i=0;i<n;i++)
            printf(" %d ",A[i]);
        printf("\n");
        if (kol%290==0)
            getch();
    }
    
    void Shift(int A[], int k)
    {
        int i;
        if(k<2)return;
        for (i=0;i<k-1;i++)
        {
             Shift(A, k-1);
             if (!(i>=2 && k%2==0))SAW(&A[k-1],&A[0]);
             else SAW(&A[k-1],&A[i-1]);
             deduction(A);
        } 
        Shift(A, k-1);
    }
    
    void main()
    {
        int A[N],i;
        printf("vvedite n\n");
        scanf("%d",&n);
        for (i=0;i<n;i++)
            A[i]=i+1;
        deduction(A);
        Shift(A,n);
        printf("\n %d \n",kol);
    }

    Классический вариант быдлокода в программе, которая печатает всевозможные комбинации перестановок цифр заданной длины. Для того чтобы поменять два значения местами используется отдельная функция SAW, которой передаются указатели на переменные (автор думает, что это круто), в самой же функции производится обмен значений, на которые указывают указатели без помощи дополнительной переменной (опять же автор считает, что это круто), причем, стоит обратить внимание, каким образом это делается (видимо операция XOR этому кодеру пока не известна). Далее классический стиль написания быдлокодера прослеживается буквально в каждой строчке, включая названия функций. Стоит также обратить внимание на оригинальную реализацию рекурсивной процедуры, проницательный читатель сразу же поймет смысл комментария в строке: int n,kol=1;//одекватен до 6!

    Запостил: jkoff, 25 Декабря 2010

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

    • Сломал мозг. Мало того, что глобальные переменные, да ещё k вызовов Shift из Shift с одинаковыми параметрами. Автор сам понял, что он написал?

      Инкремент в функции SAW переменной, используемой при форматировании вывода, тоже круто.
      Ответить
      • достали уже лабы постить...

        > Инкремент в функции SAW переменной, используемой при форматировании вывода, тоже круто.

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

        работает оно или нет ХЕЗ, но такого я уже насмотрелся вдоволь в универе.
        Ответить
    • Обмен прикольный, если дать одинаковые адреса, то оба обнулятся. Но это же так круто - не использовать доп. переменную!
      Ответить
      • Не заметил сразу. А паскалист никогда бы так код не написал! Всё это говорит о том, что Си — очень ненадёжный язык.
        Ответить
        • Да, это тоже говорит об опасности языка Си!!111 (с поднятым вверх пальцем).
          На самом деле этот тот случай, когда передача по указателю нагляднее говорит о возможных проблемах, чем передача по ссылке - новички могут не знать, что ссылка это завуалированный указатель.
          Ответить
          • >Да, это тоже говорит об опасности языка Си!
            В Pacal/Delphi тоже можно так написать. Двум указателям на integer дать одинаковые адреса и оно обнулится. Теперь паскаль тоже опасный язык?
            Ответить
            • Ты вообще стёб воспринимаешь, или как? Я что, должен везде смайлики ставить, типа закадрового смеха в американских комедиях, потому что средний пользователь интернета настолько отупел, что без них не видит иронии?
              Ответить
              • Давно пора вводить на сайтах http://www.w3.org/TR/emotionml/
                А ещё слово «лопата» и вставку картиночек с демотиваторов или с Лурочки.
                Ответить
              • Извиняюсь, не к Вам хотел обратится.
                Ответить
              • > передача по ссылке - новички могут не знать, что ссылка это завуалированный указатель.

                В Си нет передачи по ссылке. Только в паскале. Паскаль опасен!
                Ответить
                • Ололо риальне!
                  Ответить
                  • А как Вы думали реализовано ключевое слово var
                    procedure ProcWithLinkArg(var LinkArg:integer)
                    ?

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

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

                        Познай же мир ретипизации.

                        Например, прямое обращение к пикселу изображения:
                        PColor(integer(Buf.Mem) + (X + Y shl Buf.OrdX) shl 2)^
                        Это под 32 бита.
                        Ответить
                        • >integer(Buf.Mem)
                          >Это под 32 бита.
                          А если кросплатформенно захочу? 10 реализаций делать?
                          Ответить
                          • Кроссплатформенно говорите? Знаете, сколько программ для реального режима x86 сишникам пришлось чуть ли не с нуля переписывать, когда появился защищённый режим и 32-битная адресация? Низкий уровень автоматически кроссплатформенным не сделать.
                            Ответить
                            • >Низкий уровень автоматически кроссплатформенным не сделать.

                              Ну это как писать. Если говнокодить, то да.
                              Вообще есть size_t и ptrdiff_t и прочие. Вот как эта проблема в си решается.
                              Ответить
                          • Да, а что такого?
                            Если пишешь под конкретное устройство, то под него и пиши.
                            Ответить
                            • Устройство конкретное, но работает в 64хбитной и 32хбитной винде. И Ваш код фейлит. Приходится его копипастить.
                              Ответить
                              • Ну {$IFDEF} добавь, делов-то...
                                Ответить
                                • Это костыль.
                                  Ответить
                                • Хотелось бы посмотреть на тонны копипастного кода с сотней ифдифоф. Это даже в Си++ не поощряют.
                                  Ответить
                  • Обращение как к массивам есть. Если p — произвольный указатель, то PWordArray(p)^[i] — i-й элемент массива.
                    А итераторы — это грабли. Трудно понять, что делает выражение *p++.
                    Ответить
                    • Когда трудно понять - следует ставить скобки. А вообще, существует определенный приоритет операций. И он стандартизован.
                      Ответить
                      • Не в приоритете дело, а в том, что инкремент указателя в Си может изменить его на неожиданное значение, отличное от единицы.
                        Ответить
                        • Это где Вы такую проблему углядели О_о?

                          Инкремент указателя, в зависимости от типа - это плюс. Или Вы не об этом?
                          Ответить
                          • Это удобно, но это неинтуитивно.
                            Ответить
                            • Вам нужно тренировать интуицию.
                              Ответить
                              • Завидую Вам. Умеете убеждать даже Кэпа.
                                Ответить
                                • Вы реально КЭП? Завидую Вам. :)
                                  Ответить
                                  • Не знаю, но так меня называли на нескольких сайтах. Несколько независимых авторов не могут ошибаться.
                                    Ответить
                                    • Мне Ваша аватарка нравится.
                                      Не хватает только задорной фуражки кепа. )
                                      Ответить
                                      • Здесь так любят осуждать аватарки, особенно делать событие из каждой новой аватарки bugmenot'а. Может быть, мне тоже так часто аватарку менять, тогда офтопить будет гораздо проще?
                                        Ответить
                                        • Определенно.
                                          Ответить
                                        • >Здесь так любят осуждать аватарки

                                          Как видите, я её не осуждаю.
                                          Ответить
                                          • Как здорово всё-таки делать опечатки. Они стимулируют выброс новых комментариев.
                                            Ответить
                                        • хм, пора менять %)
                                          Ответить
                • ну вот классический пример из драйвера (все лишнее убрал, чтобы не загромождать).
                  DWORD MMBAR, *mmio;
                  //тут из пространства PCI устройства считывается MMBAR
                  mmio = (DWOR*)KernelMapPage(MMBAR, ...); //из самой библиотеки ядра
                  //......
                  mmio[0x100] = 0x00000F80; //вот это меня интересует как будет выглядеть на чистом паскале без библиотечныхх функций потому что нет ни каких гарантий, что они будут работать в режиме ядра
                  //.....
                  Ответить
                  • type PDWORD = ^cardinal; PDWORDArray = ^array[0..MaxInt-1] of cardinal;
                    var MMBAR: cardinal; mmio: PDWORD;
                    //тут из пространства PCI устройства считывается MMBAR
                    mmio := (PDWORD)KernelMapPage(MMBAR, ...); //из самой библиотеки ядра
                    //......
                    PDWORDArray(mmio)^[$100] := $00000F80; //вот это меня интересует как будет выглядеть на чистом паскале без библиотечныхх функций потому что нет ни каких гарантий, что они будут работать в режиме ядра
                    //.....
                    Если объявить mmio сразу как PDWORDArray, то второй пример будет проще: mmio^[$100] := $00000F80;
                    Ответить
                  • >DWORD MMBAR, *mmio;
                    Кстати, это мне всегда казалось граблей.
                    DWORD* MMBAR, mmio;
                    И уже не верно... Получается часть типа к имени переменной переносится.
                    Ответить
                    • Лучше вообще каждую переменную объявлять в отдельной строке с указанием типа. Получается читабельнее. И недоразумений с указателями не возникнет. Хотя в любом случае это проблема только для недостаточно знакомых с языком.
                      Ответить
                      • Люблю когда тип отдельно и имя переменной отдельно.
                        Щи и мухи должны быть отдельно.
                        Ответить
                        • typedef sometype* sometypePtr
                          и в путь.
                          Ответить
                          • Для каждого указателя зарабатывать себе лишний артроз пальцев рук?
                            Неудачная шутка.
                            Ответить
                            • Не для каждого указателя, а для каждого типа. Я привел Вам пример разделения переменных и типов, о котором вы грезили. Без лишних шуток. У MS такое сплошь и рядом встречается между прочим. При этом не хочу сказать что это хорошо или плохо.
                              Ответить
                              • Согласен, типа. Описька.
                                Вообще иногда нужно постараться, что-бы придумать сотню другую типов в С++ для обычных указателей.
                                typedef const int* ConstIntPtr;
                                typedef int* const intPtrConst;
                                typedef const int* const ConstIntPtrConst;
                                typedef volatile int* const * const VolatileIntPtrConstPtrConst;
                                typedef volatile const CPPClass* volatile const * volatile const * volatile const UbeiteMena;
                                Впрочем, последняя строка очень даже надуманна, но классов в С++ может быть больше переменных в программе. Неужели для каждого придумывать свой тип указатель?
                                Ответить
                                • Если хочется разделять мух - то придется придумывать. Но проще использовать вариант, предлагаемый языком по умолчанию. Т.е. смириться с "необычным" разделением типа и имени переменной.
                                  Ответить
                                  • Верно.
                                    Придёться смириться или идти в комитет стандартизации на место "генерального секретаря".
                                    Ответить
                                • Отличие семантической вёрстки от Web 1.0 знаете (это ради аналогии)? Совсем не обязательно обзывать производные типы по базовым, можно же назвать по их применению.
                                  Ответить
                                  • Можно, но все равно много писать и боюсь слово pointer в каком либо виде там будет все равно присутсвовать.
                                    Ответить
                      • +1 Так и делаю, дабы избежать неожиданностей.
                        Ответить
                • в добавок
                  static BYTE (*GetBootDevice)();
                  //...
                  GetBootDevice = ((void*)0xFA000100);
                  //...
                  BYTE dev = GetBootDevice();
                  а вот это?
                  Ответить
                  • Так в паскале нельзя. Пытался... Хотя штука полезная для дров.
                    Ответить
                  • type myfunc = function:byte;
                    var GetBootDevice: myfunc;
                    dev: byte;
                    //...
                    GetBootDevice := Ptr($FA000100);
                    //...
                    dev := GetBootDevice;
                    Ответить
                    • это чего за паскаль у вас такой? я кинул в BP оно не хочет воспринимать такой код.
                      Ответить
                      • @GetBootDevice := Ptr($FA000100);
                        Ответить
                        • Так можно? Да ну!
                          Ответить
                          • Это я про то, что Инканус забыл один символ вписать, чтобы код компилировался.
                            Ответить
                        • Точно! С «собачкой» связан ещё один интересный момент, когда переменная процедурного типа в правой части...
                          Ответить
                        • /* Чем-то смутно напоминает о PHP. */
                          Ответить
                          • Это не подавление вывода об ошибке или эха. В Паскале @ — взятие адреса (как & в Си).
                            В случае же процедурного типа возникает неоднозначность, поэтому @ используется для предотвращения вызова функции. Если же надо взять адрес функции, используется (о, ужас!) @@. В FPC синтаксис немного иной.
                            Ответить
                          • Это именно, что-бы затыкать ошибки... ...ошибки в проектировании неоднозначного синтаксиса языка.
                            Ответить
                            • В FPC несогласованность синтаксиса устранена.
                              Borland-style:
                              type myfunc = function:byte;
                              function DoSomething:byte;
                                begin
                                  Result:=0
                                end;
                              var GetBootDevice: myfunc; 
                              dev: byte;
                              //...
                              @GetBootDevice := DoSomething;
                              //...
                              dev := GetBootDevice;
                              FPC-style:
                              type myfunc = function:byte;
                              function DoSomething:byte;
                                begin
                                  Result:=0
                                end;
                              var GetBootDevice: myfunc; 
                              dev: byte;
                              //...
                              GetBootDevice := @DoSomething;
                              //...
                              dev := GetBootDevice;
                              Здесь собачка в правой части, потому что мы извлекаем адрес, а не вызываем функцию, что логично.
                              Ответить
                      • В BP указатели длинные: сегмент и смещение, то есть будет Ptr(selector,offset)
                        А если Вы хотите использовать 32-битные смещения в 16-битном компиляторе, то даже в Си без асма никак.
                        Ответить
                    • Наверное, я плохо пытался или на какие другие грабли наступил... Не помню... Давно было...
                      Ответить
                • Кстати желающим показать, что на паскале можно написать все, что угодно предлагаю написать низкоуровневый код который должен выводить строчку на экран (в текстовом режиме) в PM32 и завешивать процессор. А качестве загрузчика можно использовать GRUB и без всяких сторонних компонентов написанных на других языках. На Си для этого потребуется написать всего несколько строк кода.
                  Ответить
                  • а да ессно без помощи встроенного ассемблера
                    Ответить
                    • Можно узнать все условия? Вывод через видеопамять или через BIOS? Компилятор — Deplhi, VP, FPC, gpc, TMT или ещё какой-нибудь?
                      Ответить
                      • Как хотите. Встроенный ассемблер не использовать (главное условие)! Также не использовать "прокладок" на другом языке между вашей прогой и загрузчиком.
                        Ответить
                      • А как вы собираетесь BIOS использовать в голом PM? компилятор используйте какой хотите, пример на Си я уже написал, сейчас выложу все вместе на файлообменник
                        Ответить
                        • >BIOS использовать в голом PM
                          В защищённом режими для работы с BIOS можно использовать точки входа, специально для этого предназначенные. В частности они есть для работы с видеорежимами.
                          Если есть желание, то в ряде случаев можно переключится в реальный режим и пользоваться чем хочешь.
                          Ответить
                          • Да да и все это из паскаля без ассемблера (еще скажи через VM86). Да есть точки входа в сервисы BIOS32, ACPI..., но никаких функций вроде вывода символа на экран или строки там нет. Да и вообще в сто раз проще это сделать через видеопамять - писать то особо нечего. Ах да покажи мне код переключения в реальный режим без ассемблера (приму даже на си).
                            Ответить
                            • >о никаких функций вроде вывода символа на экран или строки там нет.

                              Не спорю. В контексте данной задачи Ваши аргументы неоспоримы.
                              Ответить
                            • >Ах да покажи мне код переключения в реальный режим без ассемблера (приму даже на си).

                              Вообще легкосложно без ассемблера, но возможно.
                              Набил массивчик в сегменте кода опкодами любых инструкций ассемблера и передал туда управление. Конечно, стоит вопрос о записи в сегмент кода...

                              В паскале, правда, эта проблема не стоит:
                              В плане запрета использования ассемблера в языке Pascal встроен оператор inline. Там пиши любые опкоды и передавай им управление.
                              Ответить
                              • inline -- не просто паскаль, у турбо, и сейчас это уже выпилено
                                Ответить
                              • а можно взять и на мониторе написать маркером "Hello world". Хватит тут уже цирк устраивать, речь идет о языках программирования.
                                Ответить
                                • Испугались, что Pascal с возможностью inline уделает Си? Лучше бы показали, что у Си тоже есть такая возможность.


                                  >а можно взять и на мониторе написать маркером "Hello world"

                                  Не наш метод. Это предложили Вы.
                                  Ответить
                                  • В си конечно можно. Собственно так делал, только код ессно не руками набивал, а из файла грузил. А как передать управление я уже показывал в каком-то комментарии - поищите.
                                    Только разговор уже идет не по существу.
                                    Ответить
                                    • >А как передать управление я уже показывал в каком-то комментарии - поищите.

                                      Зачем искать, если я это видел.
                                      В любом случае заполнить массивчик и передать управление в него не будет так просто, как Вы говорите. Не всегда разрешено выполнение "сегмента данных". Это нужны будут дополнительные телодвижения.
                                      На паскале проблем будет меньше, тк опкоды записанные в inline в любом случае будут в "сегменте кода".
                                      Ответить
                                      • Ну это как раз не проблема. К тому же в прикладных программах потребности в этом как правило не возникает. А внутри драйвера пространства ядра, где потребность в этом может возникнуть скорее всего будет отсутствовать подобная защита. А если и будет, то ее без особых усилий можно обойти.
                                        Ответить
                                • *У Вас невообразимое желание защитить Си.
                                  *У меня понять сильные и слабые стороны инструмента.
                                  Ну и заодно немного посмеяться. Не ходить же всё время унылым букой. :)
                                  Ответить
                  • В паскале просто стандартная библиотека под это не предназначена...
                    Ответить
                  • Образец кода на Си в студию!
                    Ответить
                    • Вы распугали всех с говнокода. Люди даже перестали комментить во всех ветках.
                      Наверное, бояться вопроса: "Где здеси Си?"
                      Ответить
                      • s/ться/тся/
                        Граммар-наци негодует!
                        Чёрт! Кажется, последнего живого испугал.
                        Ответить
                        • Это особая форма троллинга.
                          Поднимаю бурю негодования Граммар-наци. А то все с говнокода пропали... Какая ошибка ещё более заметна, чем эта(и не похожа на опечатку)? Помоему нет такой.
                          Ответить
                          • Да Говнокод.ру — вообще школа троллей. Остальные сайты по сравнению с ним детским садом кажутся.
                            Ответить
                            • Давайте, поспорим как правильно писать:
                              КЭП, Кэп, кэп, Cap или Кеп?
                              Ответить
                              • Правильно писать «капитан».
                                Ответить
                                • Тогда уж правильно писать
                                  «капитан Очевидность»?

                                  НеНеНе. Длиннннно.
                                  Ответить
                    • http://www.sharemania.ru/0164166 вот пример на Си (со всем барахлом вплоть до файла сборки) только что мной написанный + мой загрузчик. Кто хочет может к своему коду использовать мой загрузчик, а если не нравится то GRUB.
                      Ответить
                      • ПОСОНЫ НЕ КАЧАЙТЕ, ТАМ ВИШМАСТЕР, ВЕСЬ ВИНТ РАЗВОРОТИЛО, ПИШУ С ТЕЛЕФОНА
                        Ответить
                      • >то хочет может к своему коду использовать мой загрузчик
                        Загрузчик:
                        BYTE Image[MAX_IMAGE_SIZE];
                        LoadImage(Image);
                        if(GetProgramingLanguage(Image)==PL_PASCAL)
                          for(i=0;i<MAX_IMAGE_SIZE;i+=10)
                              Image[i]=OPCODE_NOP;
                        GoToEntryPointOfProgramAt(Image);
                        Ответить
                        • тяжелый случай...
                          я загрузчик как раз писать не прошу. И хоть бы узнал вообще, что это такое.
                          Ответить
                          • Не обижайтесь. Это шутка. Уверен, что Ваш загрузчик в меру хороший. :)
                            Ответить
                    • Да кстати пример образом записывается на дискету, при отсутствии соотв. дисковода можно пользоваться виртуалкой.
                      Ответить
                • вот кстати просьба паскалевистов переписать на паскаль:
                  char *TextVideoMem = (char*)0xB8000;

                  void PutStringTo(int X, int Y, char *string, char attr)
                  {
                  char *base = TextVideoMem + X + Y*160;
                  char c;
                  while(c = *string++)
                  {
                  *base++ = c;
                  *base++ = attr;
                  }
                  }

                  void KERNEL()
                  {
                  PutStringTo(30, 12, "Hello world from binary C code", 12);
                  for(;;);
                  }
                  это прямо тот .c файл что в архиве, где пример низкоуровневой моей программы на Си.
                  И потом код сравним...
                  Ответить
                  • const TextVideoMem: PByteArray = Ptr($B8000);
                    
                    procedure PutStringTo(X, Y: integer; s: PChar; attr: byte);
                      var
                        base: PByteArray;
                      begin
                        base := @TextVideoMem^[X + Y*160];
                        while(s^ <> #0) do
                          begin
                            base^[0] := ord(s^);
                            base^[1] := attr;
                    	base:= @base[2];
                    	inc(s)
                          end
                      end;
                    
                    procedure KERNEL;
                      begin
                        PutStringTo(30, 12, 'Hello world from binary C code', 12);
                        while true do;
                      end;
                    Ответить
                    • Хорошо теперь скомпилируйте его так чтобы получился голый байт-код (т.е. одна секция кода), чтобы ему можно было передать управление из загрузчика. Ах да если собираетесь использовать мой, то он предполагает смещение секции кода 0x00007E00. Код ессно 32-х разрядный для "плоского" PM32. И посмотрим, что получится.
                      Ответить
                      • Ключ -J в Delphi генерирует obj-файл. Дальше дело за линкером.
                        Ответить
                        • я не знаю как у вас там в паскале и дельфи у меня нет, готовый байт-код в студию!
                          Ответить
                          • байт-код, ЛОЛШТО?
                            Ответить
                            • Уверен, человек оговорился.
                              Ответить
                            • Я уже писал что - чистый код без всяких заголовков и секций которому может передать управление загрузчик. Короче секция кода. Если заработает, то я соглашусь, что на паскале можно написать все, что угодно.
                              Ответить
                              • Мы всё понимаем. :-[

                                Чистый код потом можно вытащить сторонними утилитами типа Exe2Com или Exe2Bin.
                                Ответить
                                • Вот только будет ли он после этого рабоать...
                                  Ну ладно я с нетерпением жду.
                                  Ответить
                                  • А какие есть возможные причины последующей его не работы полсле применения этого метода?
                                    Ответить
                                    • Ну вот я и хочу посмотреть. /*только чего то не вижу*/
                                      Ответить
                                      • Боюсь, Вы вряд ли дождетесь... На говнокоде редко доходит до дела. (Позор мне.) Вы единственный за последние месяцы не поленился что-то сделать*. :-[

                                        (*) Также Striker (админ форума), и кажется (извиняюсь, если ошибся) inkanus-gray (пользовательский скрипт для борьбы с местным нарушителем правопорядка, под ником "Компренда").
                                        Ответить
                                      • Проблема в том, что в Free Pascal/Delphi вызывается инициализация приложения (стандартной библиотеки) и как её убрать не знаю(лучше стандартную библиотеку system вообще выпилить, что-бы не мешалась).
                                        Умельцы, если знаете, то говорите. Это вопрос защиты Паскаля...

                                        В С++ это исправляется легко. Просто переопределяется maincrtstartup, вызывающая инициализацию стандартной библиотеки и в ней уже вызывают вышеназванную функцию KERNEL.
                                        Ответить
                                        • http://xproger.mentalx.org/old/?id=1&doc=delphi_min
                                          Ответить
                                        • Два решения:
                                          1. Переписываем модули System и SysUtils (см. ссылку TarasB).
                                          2. Выводим obj-файл и используем внешний линкер. Этот вариант таит опасность неопределённых внешних ссылок, если код требует функции модуля System.
                                          Ответить
                                          • >Этот вариант таит опасность

                                            Это точно не сработает. Какая уж тут опасность...
                                            Ответить
                                        • Относительно си не совсем так, ну ладно. Стандартная библиотека вообще не линкуется.
                                          Ответить
                                          • >Стандартная библиотека вообще не линкуется.

                                            Это ведь обращение ко мне? Возможно я там где-то описался, так что это естесвенно... :-[
                                            Ответить
                                            • >Это ведь обращение ко мне?

                                              Без цитат тежеловато понять к кому запрос, когда посты дошли до края экрана...
                                              Ответить
                                      • Фактически в С++ maincrtstartup - точка входа в программу. Возможно ли переназначить точку входа в Free Pascal/Delphi или переопределить старую?
                                        Ответить
                            • согласен, немножко не то имел ввиду, байт-код чаще в другом смысле применяется. Теперь понятно? если нет то смотрите c_code.bin (лучше с дизассемблером)
                              Ответить
                              • лучше использовать старый термин "P-код"

                                помнится, когда-то давно один чувак описанным выше способом сделал драйвер типа VXD под Win9x
                                Ответить
                  • Познай же силу директивы absolute!
                    type
                    TScreenSymbol = record
                    Symbol: char;
                    Color: byte;
                    end;


                    Screen: array [0 .. 49, 0 .. 79] of TScreenSymbol absolute $B800: $0000;
                    Ответить
                    • Кажется, ничего кроме статического константного захардкоденого адреса она не умеет?
                      Ответить
                      • Можно ставить абсолют на другие переменные (в том числе и на переданные в процедуру параметры), а что?
                        Ответить
                        • Уверены? Если да, то ОК.
                          Ответить
                          • procedure myproc(x: integer);
                              var
                                y: char absolute x;
                                z: byte absolute x;
                                a: array[0..3] of byte absolute x;
                                b: array[0..1] of word absolute x;
                                c: single absolute x;
                                d: array[0..1,0..1] of byte absolute x;
                            ...
                            Это позволяет интерпретировать значение как угодно.
                            Ответить
                        • я не согласен :)
                          Ответить
                    • TScreenSymbol = record
                      Symbol: char;
                      Color: byte;
                      end;
                      packed забыли? После выравнивания компилятором этой структуры - может получится не рабочий код...
                      Ответить
              • > И с чего вы взяли, что Си нормальный программист не напишет надежный код?

                Статистика же. Граблей в языке много.

                > вам все равно потребуется "лезть" напрямую в память

                Я вспоминаю тему, где какая-то школота всем доказывала, что только си позволяет записать в нулевой адрес памяти.
                Ответить
                • А чего не позволяет!? Вам продемонстрировать? в реальном режиме работы x86 запросто без помои ассемблера заменю обработчик исключения деления на ноль (вектор которого как раз находится в 0). ДА могу и в защищенном, только как в нем память ниже 1 менагайта уже имеет другое значение поэтому никакого эффекта не будет.
                  Ответить
                  • >без помои ассемблера заменю обработчик исключения деления на ноль

                    Так не хорошо. Прирывания нужно запретить, прежде чем замещать. А тут без ассемблера не обойтись. Стандартная библиотека это не позволяет.
                    Ответить
                    • Уважаемый, "Деление на 0" это не аппаратное прерывание, а исключение CPU, оно не может произойти по сигналу от контроллера прерываний и инструкция cli от него не поможет.
                      Ответить
                      • Вообще то, на прерывание "деление на 0" - повешано больше, чем только деление на 0. Читайте про архитектуру x86, если интересно.

                        К тому же во время замены прерывания может произойти прерывание по таймеру и там произойдет деление на 0.

                        Прерывание деления на ноль может даже произойти на другом ядре, а обработаться на этом.
                        Ответить
                        • Вот только не надо отсылать меня читать архитектуру x86 (я очень много низкоуровневого кода под нее написал). И вы действительно верите, что такое может случится в реале? Для особо параноидальных я привел пример как можно отключить аппаратные прерывания без ассемблера. А вы знаете, что во время установки прерывания может возникнуть SMI, а внутри него деление на ноль? А стандартных способов полностью отключить SMI нет.
                          Ответить
                          • Знаю. Только не SMI, NMI.
                            Ответить
                            • А да вы даже не знаете что такое SMI - бегом читать архитектуру x86. Кстати как раз NMI отключить можно и я отключал. NMI вегда стараются отключать перед входом в PM, хотя перед установкой прерываний редко.
                              Ответить
                            • чтобы гулом воспользоваться проще было SMI - "System Mode Interrupt".
                              Ответить
                          • >Вот только не надо отсылать меня читать архитектуру x86 (я очень много низкоуровневого кода под нее написал).

                            А я мало. Не хочу быть задротом, знающим все особенности архитектур всех платформ. Мне больше нравятся математические и алгоритмические задачки. :-[
                            Ответить
                            • Тогда не надо с таким рвением доказывать вашу правоту по данному вопросу.
                              Ответить
                              • Мне казалось, это больше нужно Вам, чем мне. Чтож. Не буду.
                                Ответить
                            • >алгоритмические задачки

                              Есть файл в нём лежат натуральные числа в произвольном порядке. Они не превосходят N, при этом их количество также не превосходит N. Нужно наискорейшим образом перенести эти числа в другой файл в невозрастающем порядке. Памяти произвольного доступа хватает, чтобы все числа в ней разместить.
                              (для головоломности можно попробовать покрутиться, если разместить в памяти можно M < N числе только)
                              Ответить
                              • >Памяти произвольного доступа хватает, чтобы все числа в ней разместить.
                                Тоесть в памяти можно завести массив N чисел? Если так, то слишком просто.

                                >Нужно наискорейшим образом перенести эти числа в другой файл в
                                Так уж и скажите 2*О(N).

                                Хотите перевести тему разговора? :D
                                Ответить
                                • >Если так, то слишком просто.
                                  Это проверка.
                                  Да можно.
                                  :-)
                                  Ответить
                                  • >Это проверка.
                                    А зачем? Это же простейшая задача.
                                    1)Заводим массив-счётчик чисел (пока инициализируем нулями).
                                    2)Первый О(N):
                                    Читаем первый файл и встретив каждое число прибавляем в соответсвующей позиции массива-счётчика 1.
                                    2)Второй O(N):
                                    Записываем во второй файл все числа, подсчитанные в массиве-счётчике.

                                    Думаю, не стоит отвлекаться от темы разговора. :)
                                    Ответить
                                    • Студенты пугаются её :-)
                                      Нужно сообразить, что в массиве, в отличие от списка, найти позицию с индексом стоит одну операцию.
                                      А задача жизненная, приходилось такое писать. Там были действительные числа, но перемножением приводились к целым конечно же :-)


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


                                      > не стоит отвлекаться от темы разговора
                                      P.S. Эта ваша тема Pascal vs. С такая скушная... Её нужно было обсуждать годах в 70х, когда Паскаль уже был и вдруг начинают писать Си, и вопрошать у лаборатории Белла: "Зачем вам Си, коль есть такой крутой Паскаль?" Тогда и получили бы ответ достойный.
                                      Ответить
                                  • Кстати, Вы случаем не проходите сейчас собеседование на работу? А то я за Вас сейчас решу, а Вас возьмут на работу в гугл или микрософт. Обидно будет. Я то там пока не работаю... :-[
                                    Ответить
                                    • В Oracle! :-)
                                      Вот предо мной сидит HR манагер и мне вопросы задаёт про алгоритмы поиска и сортировки. А я с лептопа пощу их на говнокод. :-)
                                      Ответить
                    • К тому же при крайней необходимости аппаратные прерывание можно замаскировать через контроллер. Правда контроллер прерываний можно перепрограммировать и на нулевой вектор конечно, но не один человек в здравом уме такого делать не будет.
                      Ответить
                  • Дык паскаль же тоже позволяет!

                    Блин, вот как всегда, оказалось, что воинствующие сишники вообще не знают про то, что на Паскале можно приводить указатели к целым.
                    Ответить
                    • Не говорите за всех.
                      Ответить
                      • Я говорю не за всех, а только за самых упоротых.
                        Ответить
                        • А кто-то с боем доказывал что си намного безопаснее паскаля.
                          Ответить
            • Ну Вы ещё бы на VB предложили это делать... Мазахизм...
              Ответить
    • что характерно: тужился-тужился, а printf("vvedite
      Ответить
    • плюс за инкремент внутри SAW() :)
      Ответить
    • Это не стиль быдла, а скорее нуба, только что узнавшего, что обменять значения можно без промежуточной переменной. За это и говорит недостаточная безграмотность именования идентификаторов.

      PS: долго думал, что может означать SAW (вероятнее всего SWA)
      Ответить
      • Даже когда я был совсем нубом, такие приколы как этот инкремент в этом SAW() я не делал. Тут не только нубство, тут есть что-то ещё :)

        Да вообще этот SAW - шедевр в каждой строчке. Хоть бы заинлайнил, смысла от именно такого написания данной функции было бы чуть больше. :)
        Ответить
    • Если уж обменивать два значения именно таким способом, то нет никакой существенеой разницы между использованием XOR или сложением/вычитанием. Вариант со сложением/вычитанием - такая же говноклассика как и вариант с XOR.
      Ответить
      • ну разницы больной нет в любом случае говногод, но в все таки чуточку покрасивее чем с вычитанием, и немножко побыстрее на x86, правда эта небольшая добавка к скорости потеряться при вызове SAW с двумя параметрами передающими через стек (у автора не хватило знаний сделать inline).
        Ответить
        • Само заинлайнится же
          Ответить
          • Неа, вот gcc например по умолчанию всем функциям присваивает external, и конечно ни какой встраимости не будет, другое дело если функция со static, то компилятор может старается по возможности использовать как inline.
            Ответить
            • "Конечно"? Откуда взялось это "конечно"?

              Во-первых, все функции в языках С и С++ являются external по умолчанию. Т.е. именно к GCC это никакого отношения не имеет.

              Во-вторых, является функция external или static не является никакого влияния на inlining не оказывает вообще. С чего бы это? Обычному компиялтору, чтобы выполнить inlining тела функции в точке вызова надо просто иметь возможность видеть это тело, т.е. inlining выполняется только там, где функция определена (а не просто объявлена). А продвинутые компиляторы, умеющие делать глобальные оптимизации, умеют делать inlining вообще везде.

              В наше время попытки явного inlining функций - дейсвительно сомнительная и ненужная практика.
              Ответить
              • Ага, рассказывайте, а то я дизассемблером не "проходился" по сгенерированному gcc коду. Вот имеется:
                void f(int param)
                {
                //тут коротенькая процедура без циклов и всего того, из-за чего функция может не стать inline
                }
                //несколько раз вызывается в разных частях программы
                берем дизасм, смотрим - конечно же ее код никуда не встроился.

                inline void f(int param)
                {
                //все тоже самое
                }
                смотрим – чудеса (!), компилятор опять ее не встроил.

                static inline void f(int param)
                {
                //все тоже самое
                }
                смотрим – ага, а вот сейчас как раз на месте где должен быть вызов этой процедуры находится ее код, значит встроилось

                static void f(int param)
                {
                //все тоже самое
                }
                результат аналогичен предыдущему эксперименту
                Ответить
                • Ну то есть все получилось именно так, как я рассказал выше.

                  Я же ясно написал: в "традиционном" компиляторе код будет встраиваться только там, где комиплятору видно определение (т.е. тело) функции, т.е. именно и только в том объектнике, в котором функция определена. При этом встраиваемость кода никак не зависит от того, extern функция или static. Поэтому не надо было лазить дизассемблером "по разным частям программы" - никакого смысла в этом нет. Лазить надо было только по одному конкретному объектнику - тому, который содержит определение данной функции. И там было бы прекрасно видно, что функция встраивается независимо от того, extern она или static.

                  А вот чтобы она встраивалась по всей программе, нужен, во-первых, продвинутый, глобально оптимизирующий компилятор, и, во-вторых, набор соответствующих установок компиляции. Я навскидку не знаю, умеет ли gcc выполнять такое глобальное встраивание, но это уже вопрос отдельный.
                  Ответить
                  • Дак на месте каждого вызова и встраивается.
                    Ответить
          • Надеюсь, это была неудачная шутка. Иначе мне вас жаль.
            Ответить
    • ооо автор явно отжог таким кодом, особенно порадовала функция saw, долго думал от чего образовано ее название, наверное от swap :-), еще приколол инкремент глобальной переменной внутри нее. А главное обмен без третей переменной ваще отжиг полный....
      Ответить
    • Почитал комментарии. C vs Pascal vs Assembler. Честно говоря, задрали уже воинствующие ассемблерщики, освоившие архитектуру одной платформы, и носящиеся с этим знанием как с писаной торбой. Как будто никогда не слышали, например, о процессорах, аппаратно выполняющих java байт-код - и на чём тогда писать драйверы для них? ;)
      Ответить
      • прикинь себе (если ты про меня) знаю не только x86.
        и на J2ME писал
        Ответить
        • о, идея, надо спровоцировать срач интеловских ассемблерщиков с моторольными
          Ответить
          • И ещё синтаксис MASM против Ideal mode в TASM против синтаксиса AT&T. Но это будет в другом говнокоде.
            В этом мы поговорим о том, как получать байткод для JVM на Си.
            Ответить
            • Я на обоих свободно пишу и оба устраивают, правда интеловкий все таки ближе, однако вряд ли вам удастся учредить такой холливар среди ассемблерщиков .
              Ответить
              • Его устраивали уже. На говнокоде где-то было и даже довелось поучавствовать...
                Ответить
            • кстати MASM и TASM сейчас не в моде, особенно последний. Все чаще используют FASM и NASM. Хотя для разработки 16-ти битного кода первые два еще активно используются и я порой когда пишу курсовые на TASM'е для студентов, ибо преподы об FASM'e могут не знать.
              Ответить
              • >и я порой когда пишу курсовые на TASM'е для студентов
                Вы же портите студентов! Великое русское образование катится в...
                Ответить
                • В противном случае они просто вылетят. Почти все с которыми я имел дело не то, что ассемблер даже никакого ЯВУ не знали! А от слово "ассемблер" для них это как великое и очень тяжкое наказание ибо писать на нем хоть че то суразное на нем могут лишь единичные выпускники наших ВУЗов на всю нашу страну. А между тем без понимания ассемблера человек не может (за редким исключением) написать и оптимального кода на ЯВУ. Вот так напишешь программу ,прокомментируешь каждую строчку, а они (студенты) все равно даже близко не понимают как она работает (как правило это какой-нибудь простенький драйвер), вот и приходится писать лекции (да, в прямом смысле этого кода) в которых вкратце объясняешь что такое ассемблер и архитектура x86 в рамках задания. Есть те которые это усваивают и пересказав все, что усвоили перед преподом получают "отлично", а те кому пох. и учить ничего не охота как правило просто "уд.". Вот примерно так.
                  Ответить
                  • Ваша правда...
                    Ответить
                  • http://Ев._от_Матфея/гл-7_ст-6/
                    Ответить
                    • Невозможно найти удалённый сервер
                      Выпилено Сатаной?
                      Ответить
                    • Всё же Вы попрежнему можете пояснить, о чём Вы хотели нам проповедать.
                      Ответить
                      • shm> Вот так напишешь программу ,прокомментируешь каждую строчку...
                        shm> Есть те которые это усваивают и пересказав все, что усвоили перед преподом получают "отлично", а те кому пох. и учить ничего не охота как правило просто "уд.".
                        Вот вторых масса, первых единицы - стоит ли так распинаться перед всеми?
                        Может стоит увеличить акцент для первых, сведя объяснения для вторых к минимуму?..
                        Ответить
                        • Может вторых не брать в институт?
                          Ответить
                        • Не стоит думать, что это моя работа - нет конечно. Просто иногда вижу подобные "объявления" и при наличии свободного времени берусь за проект. Поэтому стараюсь помочь по максимуму, а все остальное зависит уже от добросовестности самого заказчика. Правда иногда вот сталкиваюсь с тем, что недобросовестные "помощники" берут все проекты которые увидят, а выполнить не могут. Вот тут недавно такой случай был, что парня "прокатили", а проект был серьезный, до сдачи оставалось критически мало времени. Парень конечно как все ни о асме ни о архитектуре представления не имел. В итоге я ели успел ко времени сдачи написать сам код (сидел вечерами) и только образно помог с самой курсовой.
                          Ответить
                  • "получить уд", как-то хуево звучит
                    Ответить
                    • А это их проблемы, я свою работу выполняю отсылаю им, если понравится, то извольте оплатить и вот вам код. Объясняю я зачастую бесплатно потому что знаю, что по готовой программе они и в курсовик ничего не смогут толкового понаписать, даже на дебильный вопрос типа "Где в вашем коде происходит установка прерывания?" ничего толкового ответить не смогут, ибо ассемблер для них, что китайская грамота. Вот и помогаю (в смысле объясняю) от части "по доброте душевной" и еще в надежде, что хоть какое-нибудь представление о предмете будет.
                      Ответить
                      • ящитаю, вам надо пойти в армию вместе с клиентской базой.
                        вам всё равно где их окучивать, а мне приходится обязанности HR исполнять, потому что вашими стараниями диплом ничего не значит.
                        Ответить
                        • На мой взгляд люди такого типа - это следствие. Если человек способен реализовать задачу, (но нет возможности реализоваться), что ему остаётся? Учить других. Это правильное решение, хотя бы и таким способом. Реализовываются единицы.
                          Если бы отсутствовала возможность репетиторства и/или некоей корыстной помощи обучающимся, что бы тогда стало? Был талант - нету таланта, а так он, во всяком случае, остаётся.
                          А то, что студент не хочет учится тому, чему его пытается обучить штат преподавателей - это целиком его вина. И то, что HR кроме диплома ни на что не смотрит, и ничего кроме не принимает - аналогично говорит о его (HR) компетенции...
                          Уж, если что, извиняюсь...
                          Ответить
                          • только не надо валить репетиторство и готовые д/з в одну кучу.

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

                            Только это без толку...
                            Ответить
                            • УВЫ
                              На самом деле я в скором времени закругляюсь с этим делом (нашел подработку посерьезнее).
                              Ответить
                          • > оставите мнение об этом при себе
                            учитывая, что Вы первый затронули эту тему, почему бы Вам не заткнуться первым?

                            и да, качество работы преподавателей критики не выдерживает (у них есть ряд своих интересов), однако это вашу сферу деятельности никак не оправдывает, поскольку она по сути паразирует на халатности преподавателей.
                            Ответить
                            • А я и не поднимал, просто случайно фразу обронил совсем в другом контексте, потом попросили подробнее рассказать. А хамить на эту тему начали ВЫ первым из чего делаем заключение кто еще должен заткнуться. Хотя я вас и не провоцирую, а только отвечаю на откровенную грубость в ваших сообщениях.
                              О сообщение юбилейное - 256е.
                              Ответить
                              • Исключительно из лучших побуждений и чистейщего альтруизма, ага. А ступиденты верят и деньги сами суют, без напоминания.
                                Ответить
    • Говнокод 5060, кажется, мы решили не обсуждать? :D
      Ответить
      • А разве ещё что-нибудь есть? © Алан Милн

        Да надо бы оттрассировать рекурсивные вызовы Shift, потому что без этого не понять, как оно работает.
        Ответить
      • Почитал я тут комментарии...
        Отлучился, понимаешь, на пару дней статью писать...
        А тут фигакс! И такое...
        И почему-то сразу скучно стало :-(
        Ответить
    • Кстати, специально для упоротых сионистов: в D2010 уже ввели арифметику указателей. Хотя не знаю, мне кажется, это уменьшает безопасность языка.
      В любом случае все проблемы языка связаны с отсутствием соответствующих компиляторов (или недостаточной известностью некоторых подходящих) .
      Аргменты сионистов пока смахивают на "только язык Си позволяет писать в нулевой адрес, мне хакер Вася сказал из 9б, он знает!", сионисты просто не знают возможностей Паскаля и некоторых его компиляторов.
      И ещё для особо упоротых: военные давно поняли то, о чём я говорю и изобрели язык Ада, который применяется и для встраиваемых систем.
      Так что и для написания дров Паскаль, при наличии подходящего компилятора - самое то, но увы, распространению сей поспособствовала разновидность интеллектуального дрочерства - ведь круче же писать на непонятном языке, состоящем из закорючек, чем на легко читаемом простым человеком. Круто же, когда непосвящённые тебя не понимают, сразу таким волшебником себя чувствуешь, да?
      Ответить
      • >в D2010 уже ввели арифметику указателей
        Верю, но для порядка приведите пруф.
        Ответить
      • >круче же писать на непонятном языке, состоящем из закорючек, чем на легко читаемом простым человеком. Круто же, когда непосвящённые тебя не понимают, сразу таким волшебником себя чувствуешь, да?

        Не понимаю о чём Вы. Что там нечитаемого? Многие функциональные языки много более нечитаемые для неподготовленных людей.

        В любом случае удобство чтения зависит от человека, написавшего код, например можно, если уж совсем невтерпёж, использовать конструкцию:
        #define begin {
        #define end }
        И так можно улучшать "читаемость" и дальше, в прочем мне это кажется менее читаемым.
        Ответить
        • Я бы если такую конструкцию у сишника увидел...
          Вообще для мня грамотно(!) написанный код на Си ( или на языках основанных на его синтаксисе) намного более читабельные Паскаля с его бегинами и эндами. Главный фактор - краткость, которая позволяет более быстро набивать код (хотя это это не самый важный плюс, т.к. эта скорость съедается разработкой оптимального алгоритма и отладкой) и конечно ввизуально намного проще воспринимаются сложные ветвления в циклах; в паскале такой же код пестрит теми же самыми бегинами и эндами которые затрудняют его восприятие (пок райней мере для меня). К тому же операторы вроде div и mod мне тоже кажутся излишеством затрудняющим чтение. В Си намного удобнее в этом плане есть оператор "/", и компилятор сам решает как его использовать для целых чисел или с плавающие запятой при необходимости (которая возникает не особо часто) можно сделать приведение типов.
          Ответить
          • >краткость, которая позволяет более быстро набивать код
            На языках с функциональной парадигмой ещё меньше печатать. :)

            >бегинами и эндами которые затрудняют его восприятие
            Именно так... (только для меня, конечно)

            >div и mod
            Конечно лучше:
            & | >> %
            a-=b; a<<=b;
            Ответить
            • > & | >> %
              a-=b; a<<=b;

              И чего в этом нечитабельного!? Все кратко и очень даже читабельно.
              Единственное не люблю когда в одну строчку начинают лепить:
              a+=b; b-=c; //вот это уже трудно воспринимется
              Ответить
              • >И чего в этом нечитабельного!?
                Я как бы это и сказал. Очень даже читабильно. Для меня чем короче, тем читабильнее... Не знаю почему...

                Строение мышления?
                Ответить
                • Извини, не понял просто. По поводу мышления сказать ничего не смогу.
                  Ответить
                • Но я думаю, что все-таки для большинства людей чем что-то короче тем лучше восприниматься. Конечно факт оспоримый, достаточно взять последовательность из цифр 7, 1, 3, 6, 2, 9, 4, 5, 1 и из длинных цифр 12006, 12008, 12010, 12012, 12014, конечно последняя запомнится лучше т.к. прослеживается закономерность, даже не взирая на то, что в первой суммарно меньше цифр надо запоминать. Но Си это язык, а не набор случайных символов, поэтому должен среднестатистически восприниматься лучше паскаля. Вот сразу вспоминаются, как нубы недавно типа "освоившие" Си пишут на нем нечитабельный код (пренебрегая при этом всеми соответствующими правилами), а потом на следующий день не могут понять чего понаписали и потом срут, что мол какой нечитабельный язык этот Си.
                  Ответить
                  • shm> поэтому должен среднестатистически восприниматься лучше паскаля
                    Почему?
                    Ответить
                    • Смотрите выше, я там отразил свою точку зрения.
                      Ответить
              • очень нехватает:
                ∈, ⊆, ∃, ∪, ⋂, а также ℕ, ℤ, ℚ, ℝ, ℂ
                и ∞ - как тип infinity
                Ответить
                • А я всегда говорил, что у APL самый понятный синтаксис!
                  Ответить
          • div и mod излишни? Нельзя давать компилятору решать, что делать, поскольку результат целочисленного деления и вещественного разный. Введение div позволяет писать более надёжные программы.
            Ответить
            • В С++ я сам решаю что выбрать. Хотя новичку это может быть не очевидно, это правда...
              Ответить
            • А никто и не дает, есть строгие правила неявного приведения типов. Я имел ввиду "Решать" только образно, а не в смысле, что к чему захотел к тому и привел.
              Ответить
              • Чему равно 5/3 ?
                Ответить
                • Смысле, если в код на Си прямо так и вставить? - 1. И чего в этом удивительного?
                  Ответить
                  • Удивительного то, что это неинтуитивно. Разные знаки для целочисленного и вещественного деления решают эту проблему.
                    Ответить
                    • 5.0/3 - вот вам вещественное деление. Если программист осознает(!) чего он пишет, то таких ошибок быть не должно, разве, что у новичков. Хотя я об этом даже не задумываюсь.
                      Ответить
      • "Ввели"? Арифметика указателей, как недокументированная фича, присутствовала еще в 90-х годах в Borland Pascal времен версии 6 (или какая она там была, уж не помню). В официальной документации она не описывалась, но тем не менее наличествовала через процедуры `Inc` и `Dec` и работала именно "по-сишному", т.е. сдвигала указатель в единицах размера указуемого типа.
        Ответить
        • всё не так,
          ввели
          документированная
          Ответить
          • Чего то мне кажется (может конечно я и хе прав), что разработчики потихоньку добавляют все, чего нет в паскале по примеру того же Си и не только (и конечно немаловажную роль играет востребованность этих средств), при этом сохраняя обратную совместимость, но что из этого получится - не знаю. Сомневаюсь, что это повысит популярность языка и вообще будет-ли оно кем-нибудь востребовано. Вот хочется увидеть пример как это будет выглядеть в коде.
            Ответить
            • бывш. Borland Delphi то? там не так всё просто, они продуктом ок. 5 лет почти не занимались, за это время просрали 2 платформенных бранча и неизвестное число людей из команды, включая главного архитекта. А теперь вертятся ужом, чтобы хоть как-то продавалось, потому что миллионы слоупоков до сих пор не слезли с версии 8-летней давности.
              Что касается инкремента типизированных указателей -- это же логично и очевидно. С расслаблением запрета на арифметические действия с нетипизированными указателями есть предистория: до введения двухбайтного generic символьного типа арифметика была разрешена только для типизированных символьных указателей и этим пользовались также для работы с байтовыми данными, после введения операторы потеряли смысл, и была введена локальная директива $POINTERMATH.
              Ответить
      • Как часто упоротые сионисты переходят на паскаль?
        Ответить
        • Никогда, даже когда в школе учился и то писал на Си на всех олимпиадах.
          Ответить
        • Никогда, они ж упоротые.
          Паскалисты, если переходят на си, то только ради компилятора.
          Ответить
    • Вернули! :)
      Ответить

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