Не могу инициализировать структуру с вложенными указателями на другие структуры - PullRequest
3 голосов
/ 30 сентября 2011

Я использую стороннюю библиотеку, которая определяет эту структуру:

typedef struct
{
    unsigned short nbDetectors;
    //! structure of detector status
    struct DetectorStatus
    {
        unsigned int lastError;         //< last detector internal error
        float temperature;              //< detector temperature
        detector_state state;           //< detector state
        unsigned short mode;            //< detector mode

        struct EnergyStatus
        {
            power_source powerSource;           //< front-end power source
            frontend_position frontendPosition; //< front-end position relative to the docking station

            struct BatteryStatus
            {
                bool present;                   //< battery present or not in the detector
                unsigned short charge;          //< charge level of the battery (in %)
                float voltageLevel;             //< battery voltage level
                float temperature;              //< temperature of the battery
                unsigned short chargeCycles;    //< number of charge/discharge cycles
                unsigned short accuracy;        //< Expected accuracy for charge level (in %)
                bool needCalibration;

            } batteryStatus;

        } * energyStatus;

        struct GridStatus
        {
            detector_grid grid;

        } * gridStatus;

    } * detectorStatus;

} HardwareStatus;

Эта структура используется библиотекой в ​​качестве данных, передаваемых одним из ее обратных вызовов.Так что это библиотека, которая заполняет это, я просто прочитал это.Пока все хорошо.

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

Я попробовал это:

HardwareStatus status;
status.detectorStatus->temperature = 20 + rand() % 10;
e.data = &status;
m_pContext->EventCallback( EVT_HARDWARE_STATUS, &e );

Когда я скомпилировал, я получил:

warning C4700: uninitialized local variable 'status' used

Затем я понял ... Указатели внутри структуры указывают на мусор, хорошопоймать Visual Studio!Тогда я попытался начать с объявления экземпляра самой внутренней структуры (BatteryStatus), но это не скомпилируется ... потому что это не typedef'd (он говорит, что тип BatteryStatus не определен)?Так что я получил в тупик ... Как мне заполнить структуру?

Ответы [ 3 ]

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

Вы можете инициализировать это значение:

HardwareStatus status = {};

Если вы хотите создать экземпляр BatteryStatus, вы можете сделать это, указав полное имя:

HardwareStatus::DetectorStatus::EnergyStatus::BatteryStatus bs;
3 голосов
/ 01 октября 2011

если вы хотите, чтобы все было в стеке, это должно сделать это:

// Getting structs on the stack initialized to zero
HardwareStatus status = { 0 };
HardwareStatus::DetectorStatus detectorStatus = { 0 };
HardwareStatus::DetectorStatus::EnergyStatus energyStatus = { 0 };
HardwareStatus::DetectorStatus::GridStatus gridStatus = { 0 };

// "Linking" structs
detectorStatus.energyStatus = &energyStatus;
detectorStatus.gridStatus = &gridStatus;
status.detectorStatus = &detectorStatus;

// Now you can fill and use them
status.detectorStatus->temperature = 20 + 3 % 10;
//...
1 голос
/ 30 сентября 2011

вы пытались установить в memset значение 0?

...