визуальные структуры импорта как вложенные, анонимные структуры в объединении с использованием переполнения стека

Пожалуйста, рассмотрите следующие «неизменяемые» объявления:

typedef struct T_MESSAGE
{
unsigned int  uiTimestamp;
unsigned char ucDataType;
unsigned int  uiDataSize;
unsigned char aucData[1024];
} TT_MESSAGE;

typedef struct T_SENSORDATA_HEADER
{
unsigned char ucSensorType;
unsigned char ucMountingPoint;
} TT_SENSORDATA_HEADER;

Если сообщение содержит данные датчика, данные сохраняются в массиве aucData, всегда начиная с заголовка данных датчика. Я хотел бы создать объединение или структуру, которая позволяет мне иметь прямой доступ ко всем членам такого сообщения, не используя другое имя переменной.
Я надеюсь, что вы понимаете, что я хочу сделать, взглянув на мои предыдущие попытки.
Я попробовал это так:

union SensorDataMessage
{
struct T_Message;

struct
{
unsigned : 32;  // Skip uiTimestamp
unsigned : 8;   // Skip ucDataType
unsigned : 32;  // Skip uiDataSize

struct T_SENSORDATA_HEADER;
};
};

и это:

struct SensorDataOverlay
{
unsigned : 32;  // Skip uiTimestamp
unsigned : 8;   // Skip ucDataType
unsigned : 32;  // Skip uiDataSize

struct T_SENSORDATA_HEADER;
};

union SensorDataMessage
{
struct T_Message;
struct SensorDataOverlay;
};

Но ничего из этого не работает. В конце я хотел бы иметь возможность написать что-то вроде этого:

int Evaluate(SensorDataMessage msg)
{
unsigned char tmp = msg.ucDataType;
unsigned char tmp2 = msg.ucSensorType;
[...]
}

От Вот Я понял, что то, что я хочу сделать, должно быть возможным, но только в Visual C:

Расширение Microsoft C позволяет объявлять структурную переменную
в другой структуре, не давая ей имя. Эти вложенные
структуры называются анонимными структурами. C ++ не позволяет
анонимные структуры.

Вы можете получить доступ к членам анонимной структуры, как если бы они были
члены в содержащей структуре.

Тем не менее, это, кажется, не совсем верно, так как анонимные структуры могут использоваться и в Visual C ++, как это предлагается Вот.

Я был бы очень признателен за любую помощь.

0

Решение

Вот что я нашел, может помочь вам:

  1. Приходится менять компилятор C / C ++ как Компилировать как код C (/ TC) получить анонимную поддержку структуры.

введите описание изображения здесь

  1. Пропущено ключевое слово союз на декларации Оценка ()

  2. Объявление анонимного собственного типа данных в SensorDataOverlay Кажется, это может сбить с толку компилятор, поэтому я пытаюсь собрать их в одну структуру, как CommonHeader, и положить одну пачку в SensorDataOverlay.

я нашел T_MESSAGE а также SensorDataOverlay разделяли одну и ту же схему в первых трех полях, я бы сказал, что ее лучше заменить CommonHeader, будет иметь больше смысла с точки зрения наследования данных. Поскольку в начале вопроса вы указали, что T_MESSAGE неизменяемый, поэтому я не делаю никаких изменений в следующем коде.

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


*struct CommonHeader
{
unsigned int  skipUiTimestamp;
unsigned char skipUcDataType;
unsigned int  skipUiDataSize;
};

struct SensorDataOverlay
{
/* Use CommonHeader instead */
//unsigned : 32;  // Skip uiTimestamp
//unsigned : 8;   // Skip ucDataType
//unsigned : 32;  // Skip uiDataSize

struct CommonHeader;
struct T_SENSORDATA_HEADER;
};

union SensorDataMessage
{
TT_MESSAGE;
struct SensorDataOverlay;
};

int Evaluate(union SensorDataMessage msg)
{
unsigned char tmp = msg.uiDataSize;
unsigned char tmp2 = msg.ucSensorType;

return 0;
}*
0

Другие решения

Других решений пока нет …