Как скопировать структуру (которая является структурой внутри структуры) и заполнить ее массивом структуры в C++

У меня есть структура, которая структура внутри структуры, как показано в следующем вопросе: Как динамически заполнить структуру, которая является указателем на указатель массивов в C++, реализующих xfs

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

typedef struct Sp_cashinfo
{
    LPSTR lpPhysicalPositionName;
    ULONG ulInitialCount;
    ULONG ulCount;  
}SP_CASHUNITINFO;

Эта структура является массивом структур, так как мне нужно хранить в 2D-форме (т.е. 7 раз)

int CashUnitInfo(SP_CASHUNITINFO *Sp_cdm_cashinfo)
 {
     try
    {
        -----assigned the values----------------
        hResult = WFSGetInfo (hService,dwCategory,lpQueryDetails,dwTimeOut,&lppResult); //assigned the values ,got the response 0 ie success    
        fwCashUnitInfo = (LPWFSCDMCUINFO)lppResult->lpBuffer;               
        USHORT NumPhysicalCUs;
        USHORT count =(USHORT)fwCashUnitInfo->usCount;
        Sp_cdm_cashinfo = (SP_CASHUNITINFO*)malloc(7*sizeof(SP_CASHUNITINFO));      
        for(int i=0;i<(int)count;i++)
        {
    NumPhysicalCUs =fwCashUnitInfo->lppList[i]->usNumPhysicalCUs;
    for(int j=0;j<NumPhysicalCUs;j++)//storing the values of structure
    {
        Sp_cdm_cashinfo[i].lpPhysicalPositionName   =fwCashUnitInfo->lppList[i]->lppPhysical[j]->lpPhysicalPositionName;
        Sp_cdm_cashinfo[i].ulInitialCount           =fwCashUnitInfo->lppList[i]->lppPhysical[j]->ulInitialCount;
    }
    }
 return (int)hResult;
}

Приведенный выше код был написан в библиотеке классов и должен отображаться в библиотеке классов.

Но из-за проблемы с выделением памяти я застрял, чтобы получить значение мусора для структуры, которую я создал. Я успешно заполнил основную структуру (то есть структуру внутри структуры), и мне требуются только определенные члены из этой структуры

1 ответ

Решение

У вас есть эта структура:

typedef struct Sp_cashinfo
{
    LPSTR lpPhysicalPositionName;
    ULONG ulInitialCount;
    ULONG ulCount;  
}SP_CASHUNITINFO;

При условии, что LPSTR из типов Windows, то это typedef для char * на большинстве современных систем. Если это так, то вам нужно выделить память для этого массива вместе с пространством для структуры. Когда вы создаете пространство для этой структуры, вы выделяете достаточно памяти для хранения указателя и двух других элементов данных, однако указатель еще не указывает на то, что является допустимым, все, что вы сделали, - отложили достаточно места для хранения указателя. В фрагменте кода это выглядит так, как будто массиву char здесь никогда не выделялась какая-либо память, отсюда и значения мусора.

Однако я бы изменил эту структуру на более идиоматический дизайн C++, подобный следующему:

#include <string>
struct Sp_cashinfo
{
    std::string lpPhysicalPositionName;
    uint32_t ulInitialCount;
    uint32_t ulCount;   

    Sp_cashinfo(std::string name, uint32_t initialCount, uint32_t count):
        lpPhysicalPositionName(name),
        ulInitialCount(initialCount),
        ulCount(count)
        {}
};

Поскольку управление памятью при таком подходе намного проще. Затем вы можете хранить эти структуры в std::vector и создайте служебную функцию для преобразования в необработанный массив, если это будет необходимо.

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

Другие вопросы по тегам