Ответы пользователя по тегу C
  • 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.
    Ответ написан
    Комментировать
  • Как парсить структуры с битовыми полями в С?

    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;
    Ответ написан
    Комментировать