Функциональная совместимость кода C и C ++ - проблемы передачи данных - PullRequest
0 голосов
/ 21 октября 2011

Ниже приведена ситуация.Существует система / программное обеспечение, полностью написанное на C. Эта C-программа порождает новый поток, чтобы запустить какой-то механизм обработки данных, написанный на C ++.Следовательно, система, которая у меня есть, запускает 2 потока (основной поток и поток механизма обработки данных).Теперь я написал некоторую функцию на C, которая принимает структуру C и передает ее потоку обработки данных, чтобы функция C ++ могла получить доступ к структуре C.При этом я наблюдаю, что значения определенных полей (например, unsigned int) в структуре C изменяются при доступе на стороне C ++, и я не уверен, почему.В то же время, если я передаю примитивный тип данных, например, int, значение не меняется.Было бы здорово, если бы кто-то мог объяснить мне, почему он так себя ведет.Ниже приведен код, который я написал.`

/* C++ Function */
void DataProcessor::HandleDataRecv(custom_struct* cs)
{
  /*Accesses the fields in the structure cs - an unsigned int field. The value of   
    field here is different from the value when accessed through the C function below.
   */
}

/*C Function */
void forwardData(custom_struct* cs)
{
  dataProcessor->HandleDataRecv(cs); //Here dataProcessor is a reference to the object 
                                     //of the C++ class.
}

` Кроме того, обе эти функции находятся в разных исходных файлах (одна с .c ext, а другая с .cc ext)

Ответы [ 4 ]

3 голосов
/ 21 октября 2011

Я бы проверил, что обе стороны размещают структуру в одном и том же

  • print sizeof(custom_struct) на обоих языках
  • Создайте экземпляр custom_struct на обоих языках и выведите смещениекаждой переменной-члена.
1 голос
/ 21 октября 2011

Мое странное предположение: Майкл Андрессон прав, может быть проблема со структурой.

Попробуйте скомпилировать файлы c и c ++ с

-fpack-struct=4

(или другим4).Таким образом, структура выравнивается одинаково во всех случаях.

Если бы мы могли видеть объявление структуры, это, вероятно, было бы более ясным.Структура не содержит #ifdef с конкретным кодом на c ++, как конструктор, не так ли?Также проверьте наличие директив #pragma pack, которые управляют выравниванием данных.

0 голосов
/ 21 октября 2011

Возможно, с одной стороны в структуру добавлены «пустые байты», чтобы переменные выравнивались на 32-битных границах для скорости (чтобы регистр ЦП мог указывать на переменную напрямую).

А с другой стороныструктура может быть упакована для экономии места.

0 голосов
/ 21 октября 2011

(ИСПРАВЛЕНИЕ) За небольшими исключениями, C ++ является надмножеством C (имеется в виду C89), поэтому я не совсем понимаю, что происходит. Я могу только предположить, что это как-то связано с тем, как вы передаете или вводите переменные, и / или с какими системами они работают. С технической точки зрения, если я не ошибаюсь, он не должен иметь ничего общего с совместимостью c / c ++.

Некоторые подробности помогут.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...