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)
  2. Си / Говнокод #24720

    0

    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
    #define double 1
    #define float 2
    
    #if REAL==float
    #define fft_create_arrays f_fft_create_arrays
    #define getx f_getx
    #define fft f_fft
    #define invfft f_invfft
    #define normalize_fft f_normalize_fft
    #define fft1n f_fft1n
    #define fftn f_fftn
    #define invfftn f_invfftn
    #define realfftmag f_realfftmag
    #define normalize_fftn f_normalize_fftn
    #endif
    	
    #undef double
    #undef float

    https://github.com/borsboom/vocoder/blob/master/fft.h

    gammaker, 05 Сентября 2018

    Комментарии (8)
  3. Си / Говнокод #24697

    −3

    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
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    //+-------------------------------------------------------------------------
    //
    //  Function:   GetNumberOfType
    //              SetNumberOfType
    //
    //  Synopsis:   Helpers to get/set an integer value of given variant type
    //              by dereferencing a pointer
    //
    //              pv - pointer to dereference
    //              vt - variant type
    //
    //--------------------------------------------------------------------------
    
    // BUGBUG: The VC 5 compiler flags this as an error because VT_BOOL4 is not
    // a valid VARENUM value.  Disable the warning for now.
    #pragma warning(disable:4063)       // case '254' is not a valid value for switch of enum 'VARENUM'
    
    long
    GetNumberOfType (void * pv, VARENUM vt)
    {
        switch(vt)
        {
            case VT_I2:
            case VT_BOOL:
                return * (SHORT*) pv;
    
            case VT_I4:
            case VT_BOOL4:
                return * (LONG*) pv;
    
            default:
                Assert(FALSE);
                return 0;
        }
    }
    
    void
    SetNumberOfType (void * pv, VARENUM vt, long l)
    {
        switch(vt)
        {
            case VT_BOOL:
                l = l ? VB_TRUE : VB_FALSE;
                //  vvvvvvvvvvv  FALL THROUGH vvvvvvvvvvvvv
    
            case VT_I2:
                Assert(l >= SHRT_MIN && l <= SHRT_MAX);
                * (SHORT*) pv = SHORT(l);
                break;
    
            case VT_BOOL4:
                l = l ? VB_TRUE : VB_FALSE;
                //  vvvvvvvvvvv  FALL THROUGH vvvvvvvvvvvvv
    
            case VT_I4:
                * (LONG_UNALIGNED *) pv = l;
                break;
    
            default:
                Assert(FALSE);
        }
    }

    Опять какая-то сранина известно откуда.

    CCAHA9I_CPAHIHA, 31 Августа 2018

    Комментарии (3)
  4. Си / Говнокод #24690

    +4

    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
    DWORD NEAR _fastcall RgbCompare(RGBQUAD rgb1, RGBQUAD rgb2)
    {
        DWORD sum=0;
    
        //
        //  lets do some majic shit so the compiler generates "good" code.
        //
    #define SUMSQ(a,b)                          \
        if (a > b)                              \
            sum += (WORD)(a-b) * (WORD)(a-b);   \
        else                                    \
            sum += (WORD)(b-a) * (WORD)(b-a);
    
        SUMSQ(rgb1.rgbRed,   rgb2.rgbRed);
        SUMSQ(rgb1.rgbGreen, rgb2.rgbGreen);
        SUMSQ(rgb1.rgbBlue,  rgb2.rgbBlue);
    
        return sum;
    }

    Как сложно, оказывается, посчитать (a-b)² на Си. Нужно каждый раз писать макрос для этой операции...

    CCAHA9I_CPAHIHA, 30 Августа 2018

    Комментарии (26)
  5. Си / Говнокод #24681

    0

    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 "stdafx.h"
    #include "windows.h"
    #include "iostream.h"
    #include "process.h"			// специально для потока
    
    void  fThredFunct1(void* pv);		// декларация функции потока
    __declspec(thread) DWORD dwTlsIndex;		// локальная статическая функция для потока
    
    void main()
    {
    
    	ULONG hThread1 = 0;		// Идентификатор потока 1
    	ULONG hThread2 = 0;		// Идентификатор потока 2
    	//unsigned long _beginthread( void( __cdecl *start_address )( void * ),
    	//			unsigned stack_size, void *arglist );
    	hThread1 = _beginthread(fThredFunct1,0,NULL);	// создали первый поток
    	if (hThread1==-1)
    		cout << "Error create thread" << endl; 
    	hThread2 = _beginthread(fThredFunct1,0,NULL);	// создали второй поток
    	if (hThread1==-2)
    		cout << "Error create thread" << endl; 
    	Sleep(2000);				// ждем 
    }
    
    void fThredFunct1(void* pv)			// реализация функции потока
    {
    	dwTlsIndex=TlsAlloc();		// Запросить индекс
    	if (dwTlsIndex==-1)		// проверить на ошибку
    	{
    		cout << "Error TlsAlloc " << endl;
    		return;
    	}
    	cout << dwTlsIndex << endl;
    	Sleep(1000);
    
    	if ( TlsFree( dwTlsIndex)==0 )	// освободить индекс
    	{
    		cout << "Error TlsFree" << endl;
    		return;
    	}
    }

    Многопоточное говно
    Гуглояндексится.

    kir_rik, 29 Августа 2018

    Комментарии (30)
  6. Си / Говнокод #24655

    −4

    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
    https://docs.microsoft.com/en-us/windows/desktop/api/winsock/nf-winsock-wsaasyncselect
    int WSAAsyncSelect(
      SOCKET s,
      HWND   hWnd,
      u_int  wMsg,
      long   lEvent
    );
    
    /*
    
    hWnd
    
    A handle that identifies the window that will receive a message when a network event occurs.
    */

    Почему виндовые асинхронные (или правильно говорить "небликирующиеся") сокеты так черезжопно сделаны? Нафига им через HWND надо месседжи слать? Что, другого способа нет для оповещений?
    Требовать для работы асинхронных сокетов чтоб какое-то окно было это как требовать зубную щетку для входа в туалет чтоб посрать

    j123123, 24 Августа 2018

    Комментарии (16)
  7. Си / Говнокод #24627

    −1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    #include <stdio.h>
    #include <inttypes.h> 
    
    int main(void) {
    	float a = 0;
    	float b = -9.8 * 0;
    	uint32_t* pa = (void*)&a;
    	uint32_t* pb = (void*)&b;
    	printf("%li %li %i %f %f\n",pa[0] , pb[0], pb[0]>>31, b+0, b);
    	return 0;
    }

    Нолик со взведенным знаковым битом. Вот зачем он нужен?

    Psionic, 16 Августа 2018

    Комментарии (3)
  8. Си / Говнокод #24610

    0

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    Ритчи, Томпсон, [s]Страуструп[/s] всё-таки охуенные дедки.
    Приклоняюсь перед ними.
    Придумали хуету хуй знает когда, которую, спустя 50 лет
    хуй кто смог переплюнуть. Ничего лучше за это время придумали.
    (Кроме «PHP», разумеется)
    И вряд ли придумают ещё лет сто.

    LinuxGovno, 10 Августа 2018

    Комментарии (18)
  9. Си / Говнокод #24560

    +1

    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
    http://faqs.org.ru/progr/c_cpp/cfaqrus.htm
    
    1.14:   Ну а если честно, на какой-нибудь реальной машине используются
            ненулевые внутренние представления нулевых указателей или разные
            представления для указателей разных типов?
    
    О:	Серия Prime 50 использует сегмент 07777, смещение 0 для	нулевого
            указателя, по крайней мере, для PL/I. Более поздние модели используют
            сегмент 0, смещение 0 для нулевых указателей С, что делает
            необходимыми новые инструкции, такие как TCNP (проверить нулевой
            указатель С), которые вводятся для совместимости с уцелевшими
            скверно написанными С программами, основанными на неверных
            предположениях. Старые машины Prime с адресацией слов были печально
            знамениты тем, что указатели на байты (char *) у них были большего
            размера, чем указатели на слова (int *).
    
            Серия Eclipse MV корпорации Data General имеет три аппаратно
            поддерживаемых типа указателей (указатели на слово, байт и бит), два
    	из которых - char * и void * используются компиляторами	С. Указатель
    	word * используется во всех других случаях.
    
    	Некоторые центральные процессоры Honeywell-Bull	используют код 06000
    	для внутреннего	представления нулевых указателей.
    
    	Серия CDC Cyber	180 использует 48-битные указатели, состоящие из
            кольца (ring), сегмента и смещения. Большинство пользователей
    	(в кольце 11) имеют в качестве нулевых указателей код 0xB00000000000.
    
    	Символическая Лисп-машина с теговой архитектурой даже не имеет
    	общеупотребительных указателей;	она использует пару <NIL,0> (вообще
            говоря, несуществующий <объект, смещение> хендл) как нулевой
            указатель С.
    
            В зависимости от модели памяти, процессоры 80*86 (PC) могут
            использовать либо 16-битные указатели на данные и 32-битные указатели
            на функции,  либо, наоборот, 32-битные указатели на данные и 16-битные
            - на функции.
    
    	Старые модели HP 3000 используют различные схемы адресации для байтов
            и для слов. Указатели на char и на void, имеют, следовательно,
            другое представление, чем указатели на int (на структуры и т.п.),
    	даже если адрес	одинаков.

    Более поздние модели используют сегмент 0, смещение 0 для нулевых указателей С, что делает необходимыми новые инструкции, такие как TCNP (проверить нулевой указатель С), которые вводятся для совместимости с уцелевшими скверно написанными С программами, основанными на неверных предположениях.

    Делать специальную инструкцию в процессоре для криво написанного сишного кода. Какой багор!

    j123123, 01 Августа 2018

    Комментарии (318)
  10. Си / Говнокод #24557

    +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
    44. 44
    45. 45
    http://faqs.org.ru/progr/c_cpp/watcom_c.htm
    
                    WATCOM C/C++ FAQ
    
                       version 3.0
                       29 Aug 1998
    
            compiled by Lenik Terenin, 2:5061/1
    
    Maintained by Cyril Pertsev, 2:5020/1415.1
    Please send your additions and suggestions to the above address.
    
    Для удобства потpебления данного текста
    добавления выделены символом квотинга
    
    ...
    
    > Q: Гpафическая библиотека ваткома отказывается пеpеключать pежимы/банки
    > или делает это кpиво
    
    >A: В результате ковыряния в библиотеке выяснилось, что криворукие
    >ваткомовцы
    >совершенно не задумываются ни о какой переносимости и универсальности их
    >библиотек. В результате, если видео-карта имеет в биосе прошитое имя
    >производителя или другую информацию о нем, то для нее будет вызываться
    >вместо
    >функции переключения банков через VESA, другая функция, работающая с
    >картой
    >напрямую (иногда даже через порты).
    >Единственная проблема, что у каждого производителя (ATI, в моем случае),
    >рано
    >или поздно выходят новые и продвинутые карты, раскладка портов в которых
    >может
    >отличаться от той, которая использовалась в старых моделях. В результате,
    >все
    >это свинство начинает глючить и иногда даже виснуть.
    >После того, как я руками заткнул ему возможность использовать "родные"
    >фишки
    >для конкретной карты и прописал пользоваться только VESA -- все работает
    >как из
    >пушки ;))
    >Как затыкать -- а просто, есть переменная: _SVGAType, которую я
    >описывается
    >следующим образом: "extern "C" int _SVGAType;", и потом _перед_ (важно!)
    >вызовом _setvideomode нужно сказать "_SVGAType = 1;".

    Люблю читать несвежие FAQ.

    Сегодня-то такого не встретишь, чтобы кто-то прямо в порты в видеокарту что-то писал, эхх...

    j123123, 31 Июля 2018

    Комментарии (139)