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

    +2

    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
    #include <malloc.h>
    #include <string.h>
    
    void print( void **p, int n ) {
    	int i = 0;
    	for(; i < n; ++i ) {
    		printf( "%x ", *( p + i ) );
    	}
    	printf( "\n" );
    }
    
    void get( void** pp, void** p ) {
    	*p = *pp;
    }
    
    void set( void** pp, void **p ) {
    	*pp = *p;
    }
    
    int main() {
    	printf( "sizeof: void* = %d, void** = %d\n", sizeof( void* ), sizeof( void** ) );
    
    	void ** pv = malloc( sizeof( void* ) * 8 ), **pp2;
    	memset( pv, 1, 8 * sizeof( void* ) );
    	printf( "pv = %x\n", pv );
    	print( pv, 8 );
    	
    	pp2 = pv + 2 * sizeof( void** );
    	void *p = (void*)0x01020304c, *p2  = p;
    	*pp2 = p;
    
    	printf( "pv = %x, pp2 = %x, p=%x, p2 = %x\n", pv, pp2, p, p2 );
    
    	get( pv + 1, &p );
    	printf( "result get( pv + 1, &p ) -> *( pv + 1 ) = %x, p = %x\n", *( pv + 1 ), p );
    	
    	set( pv + 2, &p2 );
    	printf( "result set( pv + 2 *, p2 ) ->  *( pv + 2 ) = %x, p2 = %x\n",  *( pv + 2 ), p2 );
    	print( pv, 8 ); 
    
    	free( pv );
    	return 0;
    }

    Просто оставлю это здесь, на будущее.
    О том, как работать с void**.

    Запостил: OlegUP, 07 Сентября 2018

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

    • ?
      Ответить
    • .
      Ответить
    • В 28 строке имелось в виду sizeof(void*)?

      З.Ы. Странная какая-то строка, зачем там вообще sizeof()?
      Ответить
      • https://ideone.com/20ZZ4Q
        Ответить
        • Понятно, что для конпелятора они все одинаковые. Но для читателя, который пытается въехать в код - нет.
          Ответить
          • bormand, ты пока не собираешься на ngk ники назад включить? Я просто общий RSS feed сделал на твоём API, мне бы юзернеймы.
            Ответить
            • Чем существующий RSS не подходит?
              Ответить
              • А понял, он из стока, а не конкретного поста.
                Ответить
            • Зачем они вообще отключены, если ссылки на профили всё равно висят?
              Ответить
              • Чтобы скрыть хуёвый парсинг ников с собачкой.
                Ответить
                • Больше всё равно таких ников зарегать нельзя, а соулривер энивей пасхалка.
                  Ответить
                • Ты настолько туп, что не имеешь представления о способе обхода данной проблемы?
                  Ответить
                  • Мне лень парсер патчить.
                    Ответить
                    • А "KDE" значит не лень?
                      Ответить
                      • "KDE" --- это святое.
                        Ответить
                        • Всё в них благостно и свято,
                          Всё тревожное светло.
                          Плещет рдяный мак заката
                          На озёрное стекло.

                          И невольно в море хлеба
                          Рвётся образ с языка:
                          Отелившееся небо
                          Лижет красного телка.
                          Ответить
                  • Какой анскилл )))
                    Ответить
            • Как сделаешь, не забудь технический пост
              Ответить
            • Он что их, и в API "защитил"? Я думал только на фронтенде замена.
              Ответить
        • Важна только последняя звёздочка. У всех указателей один размер. Что и доказали этим кодом...

          -----

          В гарвардской архитектуре указатель на данные и указатель на функцию могут быть разными. Т. е. sizeof(int *) может случайно оказаться не равным sizeof( int(*)(int)). Грёбаная сишка! Даже в крестах указатель на функцию записать проще.

          Ещё бывают архитектуры с сегментной адресацией, где может быть void far * и void near *.
          Ответить
          • > указатель на функцию записать проще.
            То ли дело Forth:
            : hello ." Hello!" ;
            ' hello VALUE f
            f EXECUTE
            Ответить
          • > В гарвардской архитектуре указатель на данные и указатель на функцию могут быть разными
            Поэтому я за «intptr_t».
            Ответить
            • Кстати, про архитектуры. На x86 отдельный метод адресации портов ввода-вывода (отдельные инструкции IN, OUT, разрядность шины ввода-вывода может не совпадать с разрядностью шины памяти). Однако, в сишке об этом решили не задумываться: сишников вообще лишили доступа к портам ввода-вывода, переложив эту задачу на Ассемблер. А ведь могли бы запилить указатели на I/O...
              Ответить
              • в сишках под х86 есть outb обыно

                в самом языке этово нет, потому что это исключтельно x86 зоморочка
                и совершенно ненужная кстати
                Ответить
                • Ко-ко-ко-как это ненужная?
                  Ответить
                  • В PDP-11 не было никаких IN и OUT.
                    Ответить
                    • > В PDP-11 не было никаких IN и OUT.
                      Именно поэтому я за «PDP-11» их нет и в сишке — она ж, ЕМНИП, как раз под «PDP-11» и делалась.
                      Ответить
          • > Грёбаная сишка! Даже в крестах указатель на функцию записать проще.

            Ита каг?
            Ответить
            • Это так:
              https://ru.cppreference.com/w/cpp/utility/functional/function
              Ответить
              • Ты имеешь ввиду?
                std::unique_ptr<std::function<int(int)>>
                Ответить
                • Какое-нибудь
                  std::function<std::function<int(double)>(double, std::function<double(int, double)>)> f;
                  читается на порядок лучше ебанутейшего
                  int (*(*f)(double, double (*)(int, double)))(double);

                  Хотя бы из-за линейности: в крестах после быстрого взгляда ясно видно, что f — это функция, возвращающая функцию double -> int и принимающая double и функцию (int, double) -> double. А вот что за ебанутый шифр скрывается за сишным определением можно понять, только если каждый день по пол-часа курить мануал сишных указателей (я, кстати, когда-то подобную хрень мог даже руками писать… а потом за ненадобностью всё забылось — в отличие от простого и понятного крестового синтаксиса).

                  Нет, разумеется, есть тайпдефы — но если на говно положить газетку, говном оно быть не перестанет.
                  Ответить
                  • Нормальные Сишники так не пишут, поэтому и проблем таких нет )
                    Ответить
                  • > Какое-нибудь
                    > читается на порядок лучше ебанутейшего

                    https://cs6.pikabu.ru/images/big_size_comm/2015-08_2/1438957724160145747.jpg
                    Ответить
                  • val f : double -> (int -> double -> double) -> int -> double
                    Ответить
                  • PROC(REAL, PROC(INT, REAL)REAL)PROC(REAL)INT f
                    Ответить
                  • > в отличие от простого и понятного крестового синтаксиса

                    Может быть вы имели ввиду: "в отличие от простого и понятного крестового синтаксиса" ?
                    Ответить
                    • Есть ли вообще используемые на практике языки (не придуманные для лулзов, типа INTERCAL) с более пизданутым синтаксисом, чем у C++?
                      Ответить
                      • Objective-C++
                        Ответить
                        • Ну вот да, более пиздецовое это если в эту мутировавшую из сишечки химеру подливать сверху еще какого-то дерьма.
                          Ответить
                        • Хорошо что Objective C++/CLI ещё не сделали...
                          Ответить
                          • Надо немножко подождать:
                            https://github.com/Microsoft/WinObjC

                            РКГ, если не ошибаюсь, говорил, что Objective-C за пределами OSX нежизнеспособен.
                            Ответить
                            • ObjC не имеет стандартной библиотеки
                              Всё, включая NSObject, есть часть apple.

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

                              Это как если бы у тебя был си, но без printf
                              Ответить
                        • Так это просто расширение языка. Синтаксис не более пизданут, чем у C++ или ObjC по отдельности.
                          Ответить
                          • > не более пизданут
                            Если сложить джве ьесконечности, то получится ьесконечность?
                            Ответить
                            • Ну подумаешь,

                              [kokoko initWith:list<pituh<fuckthisshit>> blabla];
                              Ответить
                  • https://gcc.gnu.org/onlinedocs/gcc/Typeof.html
                    typeof( typeof( int (*) (double) ) (*) (double, typeof( double (*) (int, double) )) ) f;
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|    |^^^^^^ |^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|
                           f - это функция,           |    |и прин | и функцию (int, double) -> double.|
                    возвращающая функцию double -> int|    |имающая|                                   |
                                                      |    |double |                                   |


                    По-моему получше твоей пидоросни с std::kokoko<std::kudah<kukarek>>
                    Ответить
                    • (*)
                      выглядит, как кошка путина, только поближе
                      да и в целом инсталляция создает нечто неуловимое
                      или это перфоманс?
                      Ответить
                      • Попробуем разобраться.
                        Инсталляция — это говно под дверью.
                        Перфоманс — это насрать под дверь.

                        Инсталляция — это нечто статическое, застывшее, а перфоманс предполагает действие в настоящий момент.
                        Ответить
                        • https://gcc.gnu.org/onlinedocs/gcc/Typeof.html
                          ЭКСПОЗИЦИЯ
                          
                          typeof( typeof( int (*) (double) ) (*) (double, typeof( double (*) (int, double) )) ) f;
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|    |^^^^^^ |^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|
                                 f - это функция,           |    |и прин | и функцию (int, double) -> double.|
                          возвращающая функцию double -> int|    |имающая|                                   |
                                                            |    |double |                                   |
                          
                             ЗАВЯЗКА                        |лири| РАЗВИ |      КУЛЬМИНАЦИЯ                  | НЕОЖИДАННАЯ
                                                            |ческ|  ТИЕ  |                                   | РАЗВЯЗКА
                                                            |кое
                                                            |отст|
                                                            |упле|
                                                            |ние
                          
                          По-моему получше твоей пидоросни с std::kokoko<std::kudah<kukarek>>
                          ЭПИЛОГ
                          (всегда заключает произведение. В эпилоге рассказывается о дальнейшей судьбе героев)
                          неплохой детективчик на ночь, будоражит
                          Ответить
                    • То ли дело Object Pascal:
                      type
                          f1 = function(x: double): integer;
                          f2 = function(x: integer; y: double): double;
                      var
                          f: function(x: double; y: f2): f1;
                      Ответить
                      • Толи дело С++
                        using F1 = auto (*)(int) -> double;
                        using F2 = auto (*)(int, double) -> double;
                        using F3 = auto (*)(double, F2) -> F1;
                        
                        F3 f;
                        Ответить
                    • Тут три раза непонятные (*). В std::function<> сразу ясно, что имеем дело с указателем на функцию, а тут тупо лес скобочек.
                      Ответить
                      • А вообще спасибо за typeof. Хоть скобочек и звёздочек стало больше, но читается уже легче обычного сишного лабиринта.
                        Ответить
                        • typeof -- gcc-изм. В стандарте есть только typeid и decltype.
                          Ответить
                          • Как найду что-нибудь хорошее в сишке, оно оказывается gcc-измом или ещё каким-нибудь измом, а не стандартом...

                            Прав был Царь, когда говорил, что gcc --- единственный вменяемый конпелятор. Конпеляторы, не поддерживающие gcc-измы, не нужны.
                            Ответить
                          • template<class T>
                            struct type { using of = T; };
                            
                            type<type<char*>::of [4]>::of x;
                            Ответить
                    • typeof (typeof (char *)[4]) y;
                      понятнее, чем
                      char *y[4];

                      Сразу видно, что объявляется переменная y, рядом её тип. Видно, что это массив из четырёх указателей. Только многосложно получается: ничего не значащий typeof и море скобочек...
                      Ответить
                      • то ли дело с++
                        auto y = std::array<char *, 4>();
                        Ответить
                        • #define STD_ARRAY(a, b) typeof(typeof(a)[b])
                          
                          STD_ARRAY(char *, 4) y;
                          Ответить
                          • Мам, смотри, я ломаю парсер!
                            STD_ARRAY(int (*)(int, int), 4) z;
                            Ответить
                            • Неправильно ты парсер ломаешь. Вот, смотри:
                              #include <stdio.h>
                              #include <stdlib.h>
                              
                              int main(void)
                              {
                                #define STD_ARRAY(a, b) typeof(typeof(a)[b])
                                STD_ARRAY(char, 2][2 ) y =
                                                   {
                                                     {1,2},
                                                     {3,4}
                                                   };
                                for(size_t i = 0; i < 2; i++)
                                {
                                 for(size_t j = 0; j < 2; j++)
                                   printf("%d ", y[i][j]);
                                 printf("\n");
                                }
                                return EXIT_SUCCESS;
                              }


                              А ваш плюсовый std::array так умеет?
                              Ответить
                    • #define STD_FUNCTION(a, ...) typeof( typeof( a (*) (__VA_ARGS__) ) )
                      
                      STD_FUNCTION( STD_FUNCTION(int, double), double, STD_FUNCTION(double, int, double) ) f;
                      Ответить
                      • #define STD_FUNCTION(a, ...) typeof( a (*) (__VA_ARGS__) )


                        Одного typeof вполне достаточно
                        Ответить
                        • std::function -- не (только) указатель на функцию.

                          > Instances of std::function can store, copy, and invoke any Callable target -- functions, lambda expressions, bind expressions, or other function objects, as well as pointers to member functions and pointers to data members.

                          Пирформанс же падает!
                          Ответить
                          • Именно поэтому я за "PHP": там не нужно думать о падении пирфоманса, потому что он всегда плохой.
                            Ответить
                          • > any Callable target

                            В сишке-то нет никаких других Callable target
                            Ответить
                  • Мимоходом замечу, что в S" Forth" не то что типы, даже аргументы указывать не надо. А в "PHP" ничего такого нет, именно поэтому я за "PHP".
                    Ответить
                    • В «PHP» можно в заголовке функции вообще не указывать аргументы, а внутри использовать func_get_args для получения всех аргументов. Тогда функцию можно будет вызывать с произвольным количеством аргументов. А вместо передачи указателя на функцию можно тупо передавать её имя (в кишках «PHP» лежит глобальный массив имён функций).
                      Ответить
                    • В "Bash" тоже.
                      Ответить

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