Пожалуйста, рассмотрите следующие «неизменяемые» объявления:
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 ++, как это предлагается Вот.
Я был бы очень признателен за любую помощь.
Вот что я нашел, может помочь вам:
Пропущено ключевое слово союз на декларации Оценка ()
Объявление анонимного собственного типа данных в 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;
}*
Других решений пока нет …