У меня есть структура, которая структура внутри структуры, как
показано в следующем вопросе:
Как динамически заполнить структуру, которая является указателем на указатель массивов в 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;
}
Приведенный выше код был написан в библиотеке классов и должен отображаться в библиотеке классов.
Но из-за проблемы с выделением памяти я застрял, чтобы получить значение мусора для структуры, которую я создал.
Я успешно заполнил основную структуру ((т.е. структуру внутри структуры)), и мне требуются только определенные члены из этой структуры
У вас есть эта структура:
typedef struct Sp_cashinfo
{
LPSTR lpPhysicalPositionName;
ULONG ulInitialCount;
ULONG ulCount;
}SP_CASHUNITINFO;
При условии, что LPSTR
от типы окон тогда это 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
и сделать служебную функцию для преобразования в необработанный массив если нужно.
Хранение всех ваших данных в контейнерах с последующим преобразованием на границах кода, где вы вызываете существующие библиотеки, — лучший способ справиться со сложностью такой ситуации.