• Как сделать инструкцию 15 байтной?

    megat72
    @megat72
    Программист-разработчик
    Assembler должен быть лаконичен чтобы эффективно исполняться на любом железе. К тому же, учитывая развитие новых архитектур, он еще должен быть перспективным (см. реализацию x64). Не думаю, что есть дублирующая команда/префикс - каждый вариант на счету.

    Чем-то не устраивает однобайтовый nop?
    Ответ написан
    Комментировать
  • Компрессия звука на С++, где взять?

    megat72
    @megat72
    Программист-разработчик
    Если WinOS достаточно, и нужен именно результат, то существует готовое API. Список соответствующих форматов и кодеков можно посмотреть тут
    Ответ написан
  • Curl спецсимволы и Си?

    megat72
    @megat72
    Программист-разработчик
    Uniform Resource Identifier (URI): Generic Syntax [RFC 3986]:
    the data should first be encoded as octets according to the UTF-8 character encoding [STD63]; then only those octets that do not correspond to characters in the unreserved set should be percent-encoded

    Т.е. да, дело скорее всего в кодировке: text перед подачей в curl_easy_escape должен быть закодирован в UTF-8.
    Ответ написан
    Комментировать
  • Как перенести сайт размером в 200ГБ с одного VPS на другой?

    megat72
    @megat72
    Программист-разработчик
    Думаю, прямым копированием через ssh будет проще всего:
    scp -r user@host:/home/bitrix/www /home/bitrix/www
    Команду следует выполнять с машины, куда необходимо перенести сайт. Для увеличения скорости, конечно можно предварительно упаковать директорию (но это дополнительные телодвижения, время и место [для еще порции по крайней мере в 150-200ГБ]).

    Я перекидывал таким образом крупный канадский портал в Амазон (на сервера Виргинии). Скорость между серверами составляла примерно 11МБ, так что 200ГБ, без упаковки должны телепортироваться за 5 часов.

    Попробуйте для начала замерить хотя бы скорость между своими серверами.
    Ответ написан
    Комментировать
  • Как парсить структуры с битовыми полями в С?

    megat72
    @megat72
    Программист-разработчик
    Проблема с этой структурой в том, что ее битовые поля не укладываются на границах unsigned (даже с учетом того, что Data structure alignment будет выставлен на 4 байта)

    Например, ProgramNumber находится по смещению 24 бита, но его размер - 16 бит. Компилятор в таком случае просто вынужден сместить ProgramNumber вперед на 8 бит, в седующий unsigned.

    ProgramInfoLength - со смещением 28 бит аналогично не может быть размещен по этому смещению, т.к. его размер превышает 4 бита, поэтому компилятор сдвигает его вперед на 4 бита.

    В итоге, структура не может занимать менее четырех unsigned.
    Если Вы хотите использовать ее для обхода исходной битовой строки "02b05e1fa6c1...", придется эту строку изрядно расширить (дополнительно по 32 бита на каждый блок):
    1. добавить 8 бит padding'а по смещению 24 бита
    2. добавить 4 бита padding'а по смещению 32 + 32 + 28 бит
    3. добавить 20 бит padding'а по смещению 32 + 32 + 32 + 12 бит

    И повторять эту процедуру для каждого блока
    Ответ написан
    Комментировать
  • Кто знает готовые решения по сбору трейсов?

    megat72
    @megat72
    Программист-разработчик
    Желательно(!) что бы эти сообщения не "заводились" через макросы. лучше каким-то статическим объектом или функциями.


    Думаю, тут дело как раз в C/C++. Это неуправляемые языки, поэтому все равно придется поработать ручками.

    Пишите банальную функцию для записи трейса в файл:
    void WriteMyTrace( char*pszTrace, ... ){
      va_list ap;
      FILE*f;
      va_start( ap, pszTrace );
      f = fopen( TRACE_FILE_NAME, "a" );
      vfprintf( f, pszTrace, ap );
      fclose( f );
      va_end( ap );
    }

    Пишите макрос, который будет ее вызывать:
    #define TRACE( fmt, ... ) WriteMyTrace( "%s(%i): "##fmt##"\r\n", __FILE__, __LINE__, __VA_ARGS__ )

    И расставляете в своем коде ловушки:
    ...
    if( !something( x, y, z ) ){
      TRACE( "something [%i, %x, %s]", x, y, z );
      return false;
    }
    if( !something_two( a, b ) ){
      TRACE( "something two [%i]", b - a );
      return false;
    }
    ...

    Трейсер готов. Это было не сложно.

    На мой взгляд, интереснее был бы вопрос не о сборе трейсов, а об инструментах по их анализу, т.к. собрать их для программиста C/C++ - не проблема, за форматом их представления - тоже дело не стоит, а вот правильно понять и найти по ним ошибки, особенно в многопоточных программах - это уже совсем другое дело.
    Ответ написан
    Комментировать
  • Как распределить по процессам произвольный бинарный массив в MPICH?

    megat72
    @megat72
    Программист-разработчик
    А в чем проблема, оставлять остаток последнему потоку?
    elements_per_thread = elements_count / threads_count;
    for( i = threads_count ; i-- ; ){
      thread[i].count = elements_per_thread;
    }
    thread[threads_count - 1].count += elements_count % threads_count;
    Ответ написан
    Комментировать
  • Как перевести из 16-тиричного кода в 10-тичный?

    megat72
    @megat72
    Программист-разработчик
    Не знаю, что у Вас в первых 2-х байтах, но buf[0]<<8 всегда должен давать 0, т.к. размер buf[0] - 8 бит. Правильная склейка должна предусматривать предварительное приведение октетов к unsigned short:
    ( (unsigned short)(buf[0]) <<8) | (unsigned short)(buf[1])
    Ответ написан
    Комментировать