Как скопировать структуру (которая является структурой внутри структуры) и заполнить ее массивом структуры в 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
и создайте служебную функцию для преобразования в необработанный массив, если это будет необходимо.
Хранение всех ваших данных в контейнерах с последующим преобразованием на границах вашего кода, где вы вызываете существующие библиотеки, - лучший способ справиться со сложностью подобной ситуации.