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

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

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

      З.Ы. Странная какая-то строка, зачем там вообще sizeof()?
      Ответить
      • https://ideone.com/20ZZ4Q
        Ответить
        • Понятно, что для конпелятора они все одинаковые. Но для читателя, который пытается въехать в код - нет.
          Ответить
          • bormand, ты пока не собираешься на ngk ники назад включить? Я просто общий RSS feed сделал на твоём 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...
              Ответить
          • > Грёбаная сишка! Даже в крестах указатель на функцию записать проще.

            Ита каг?
            Ответить
            • Это так:
              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 нежизнеспособен.
                            Ответить
                        • Так это просто расширение языка. Синтаксис не более пизданут, чем у 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
                            Ответить

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