Reputation: 2174
i had an global structure like this:-
struct MachineList
{
BSTR AccountId;
BSTR MachineId;
BSTR Make;
char* Make1;
BSTR Model;
char* Model1;
BSTR SerialNumber;
BSTR IpAddress1;
char* IpAddress;
BSTR Port1;
int Port;
BSTR LocationCode;
SOCKET Sock;
BSTR Status;
} MACHINELIST,*PMACHINELIST;
int MachineCount=-1;
I had an XML which i parse and store it in structure like this:- i want to add every structure that is filled by parsing into the stl list so i added the following code
vector<struct MACHINELIST > SS;
Now i get the following error :-
error C2371: 'MACHINELIST' : redefinition; different basic types error C2512: 'MACHINELIST' : no appropriate default constructor available
int GetMachineList(char *Xmlpath)
{
wLog->WriteDebugLog("Inside GetMachineList\n");
try
{
//Qualify namespase explicitly to avoid Compiler Error C2872 "ambiguous symbol" during linking.
//Now Msxml2.dll use the "MSXML2" namespace
//(see http://support.microsoft.com/default.aspx?scid=kb;en-us;316317):
MSXML2::IXMLDOMDocumentPtr docPtr;//pointer to DOMDocument object
MSXML2::IXMLDOMNodeListPtr NodeListPtr;//indexed access. and iteration through the collection of nodes
MSXML2::IXMLDOMNodePtr DOMNodePtr;//pointer to the node
MSXML2::IXMLDOMNode *pIDOMNode = NULL;//pointer to element's node
MSXML2::IXMLDOMNode *pIParentNode = NULL;//pointer to parent node
MSXML2::IXMLDOMNode *pIAttrNode = NULL;//pointer to attribute node
MSXML2::IXMLDOMNamedNodeMapPtr DOMNamedNodeMapPtr;//iteration through the collection of attribute nodes
MSXML2::IXMLDOMNodeList *childList=NULL;//node list containing the child nodes
//Variable with the name of node to find:
BSTR strFindText = L" ";//" " means to output every node
//Variables to store item's name, parent, text and node type:
BSTR bstrItemText,bstrItemNode, bstrItemParent,bstrNodeType;
//Variables to store attribute's name,type and text:
BSTR bstrAttrName, bstrAttrType, bstrAttrText;
HRESULT hResult;
int i = 0;//loop-index variable
int n = 0;//lines counter
//Initialize COM Library:
CoInitialize(NULL);
//Create an instance of the DOMDocument object:
docPtr.CreateInstance(__uuidof(DOMDocument30));
// Load a document:
_variant_t varXml(Xmlpath);//XML file to load//uncomment this
_variant_t varResult((bool)TRUE);//result
varResult = docPtr->load(varXml);
if ((bool)varResult == FALSE)
{
wLog->WriteErrorLog("failed to load XML file. Check the file name\n");
printf("failed to load XML file. Check the file name\n");
return 1;
}
//Collect all or selected nodes by tag name:
NodeListPtr = docPtr->getElementsByTagName(strFindText);//original
// NodeListPtr= docPtr->documentElement->getElementsByTagName(strFindText) ;
//Output the number of nodes:
//printf("Number of nodes: %d\n", (NodeListPtr->length));
//Output root node:
docPtr->documentElement->get_nodeName(&bstrItemText);
//%ls formatting is for wchar_t* parameter's type (%s for char* type):
printf("\nRoot: %ls\n", bstrItemText);
**PMACHINELIST MachineList;**
for(i = 0; i < (NodeListPtr->length); i++)
{
if (pIDOMNode) pIDOMNode->Release();
NodeListPtr->get_item(i, &pIDOMNode);
if(pIDOMNode )
{
pIDOMNode->get_nodeTypeString(&bstrNodeType);
//We process only elements (nodes of "element" type):
BSTR temp = L"element";
if (lstrcmp((LPCTSTR)bstrNodeType, (LPCTSTR)temp)==0)
{
n++;//element node's number
printf("\n\n%d\n", n);//element node's number
printf("Type: %ls\n", bstrNodeType);
pIDOMNode->get_nodeName(&bstrItemNode);
if(0== wcscmp(bstrItemNode, L"ModuleSettings"))
{
isModuleSettings=TRUE;
//MS.account_id_name
printf("");
}
printf("Node: %ls\n", bstrItemNode);
if(0== wcscmp(bstrItemNode, L"Machine"))
{
if(MachineCount++!=-1)
{
SS.push_back(MachineList);
}
//printf("value of count is %d\n",count);
count++;
//printf("value of count is %d\n",count);
isMachineList=TRUE;
**MachineList=new MACHINELIST;
MachineCount++;**
//MS.account_id_name
}
if(0== wcscmp(bstrItemNode, L"/Machine"))
{
printf("detected");
}
pIDOMNode->get_text(&bstrItemText);
printf("Text: %ls\n", bstrItemText);
if(isModuleSettings)//work here
{
if(0== wcscmp(bstrItemNode, L"capture_local_dir"))
{
CapturelocalDir=bstrItemText;
printf("CapturelocalDir is %ls\n",CapturelocalDir);
}
if(0== wcscmp(bstrItemNode, L"capture_log_dir"))
{
CapturelogDir=bstrItemText;
printf("CapturelogDir is %ls\n",CapturelogDir);
}
if(0== wcscmp(bstrItemNode, L"capture_log_level"))
{
CapturelogLevel=bstrItemText;
printf("CapturelogLevel is %ls\n",CapturelogLevel);
}
if(0== wcscmp(bstrItemNode, L"capture_request_interval"))
{
CapturerequestInterval=bstrItemText;
printf("CapturerequestInterval is %ls\n",CapturerequestInterval);
}
if(0== wcscmp(bstrItemNode, L"capture_connection_interval"))
{
CaptureConnectionInterval=bstrItemText;
printf("CaptureConnectionInterval is %ls\n",CaptureConnectionInterval);
}
}
if(isMachineList)
{
/* PMACHINELIST MachineList;
MachineList=new MACHINELIST;*/
if(0== wcscmp(bstrItemNode, L"MachineId"))
{
m_LocalStorage.machinelist[count].MachineId=bstrItemText;
//MachineList.MachineId=bstrItemText;
MachineList->MachineId=bstrItemText;
//printf("Machine id is %ls\n",ML[count].MachineId);
}
if(0== wcscmp(bstrItemNode, L"IpAddress"))
{
m_LocalStorage.machinelist[count].IpAddress=bstrItemText;
m_LocalStorage.machinelist[count].IpAddress1=_com_util::ConvertBSTRToString(bstrItemText);
printf("ip address1 is %s\n",m_LocalStorage.machinelist[count].IpAddress1);
MachineList->IpAddress=_com_util::ConvertBSTRToString(bstrItemText);
//printf("Machine id is %ls\n",ML[count].MachineId);
}
if(0== wcscmp(bstrItemNode, L"Port"))
{
m_LocalStorage.machinelist[count].Port=bstrItemText;
m_LocalStorage.machinelist[count].Port1=_wtoi(bstrItemText);
MachineList->Port==_wtoi(bstrItemText);
//printf("Machine id is %ls\n",ML[count].MachineId);
printf("port1 is %d\n",m_LocalStorage.machinelist[count].Port1);
}
if(0== wcscmp(bstrItemNode, L"Model"))
{
m_LocalStorage.machinelist[count].Model=bstrItemText;
m_LocalStorage.machinelist[count].Model1=_com_util::ConvertBSTRToString(bstrItemText);
MachineList->Model1=_com_util::ConvertBSTRToString(bstrItemText);
//printf("Machine id is %ls\n",ML[count].MachineId);
}
if(0== wcscmp(bstrItemNode, L"Make"))
{
m_LocalStorage.machinelist[count].Make=bstrItemText;
m_LocalStorage.machinelist[count].Make1=_com_util::ConvertBSTRToString(bstrItemText);
MachineList->Make1=_com_util::ConvertBSTRToString(bstrItemText);
//printf("Machine id is %ls\n",ML[count].MachineId);
}
if(0== wcscmp(bstrItemNode, L"SerialNumber"))
{
m_LocalStorage.machinelist[count].SerialNumber=bstrItemText;
MachineList->SerialNumber=bstrItemText;
//printf("Machine id is %ls\n",ML[count].MachineId);
}
if(0== wcscmp(bstrItemNode, L"AccountId"))
{
m_LocalStorage.machinelist[count].AccountId=bstrItemText;
MachineList->AccountId=bstrItemText;
//printf("Machine id is %ls\n",ML[count].MachineId);
}
if(0== wcscmp(bstrItemNode, L"location_code"))
{
m_LocalStorage.machinelist[count].LocationCode=bstrItemText;
MachineList->LocationCode=bstrItemText;
//printf("Machine id is %ls\n",ML[count].MachineId);
}
}
//Get the attributes:
int j = 0;//loop-index variable
long length;// number of attributes in the collection
DOMNamedNodeMapPtr = pIDOMNode->attributes;
hResult = DOMNamedNodeMapPtr->get_length(&length);
}
}
}
//Do not forget to release interfaces:
pIDOMNode->Release();
pIDOMNode = NULL;
//pIParentNode->Release();
pIParentNode = NULL;
}
catch(...)
{
wLog->WriteErrorLog("Exception occurred while parsing XML\n");
}
CoUninitialize();
printf("value of machine count is %d",MachineCount);
wLog->WriteDebugLog("Ends GetMachineList\n");
return 0;
}
Upvotes: 0
Views: 407
Reputation: 227418
To declare a vector of any type, you need to pass the type as a template parameter. In your case, the type is MachineList
:
vector<MachineList> SS;
To add an instance, you can use for example push_back()
:
SS.push_back(MACHINELIST); // add the MACHIHELIST instance
SS.push_back(MachineList()); // add a default constructed MachineList.
In your code, MACHINELIST
is an instance of type MachineList
.
Edit in response to comments: if you wanted to store pointers, you would need a vector of pointers:
vector<MachineList*> SS;
Then you can add entries thus:
MachineList* m = new MachineList;
SS.push_back(m);
You are responsible for deleting the pointer to deallocate the dynamically allocated resources at the appropriate moment. i would suggest using smart pointers instead of raw ones, but you have more fundamental problems in your code.
Upvotes: 1
Reputation: 1382
Use vector<MachineList>
. When you declare with struct MachineList { ... };
it creates a type MachineList
which is known to be a struct and doesn't require prefixing with struct
to use it.
Following the declaration with MACHINELIST,*PMACHINELIST
is C-style code and unnecessary.
Upvotes: 0
Reputation: 47267
Try:
vector< MachineList > SS;
MachineList
is the name of your struct. MACHINELIST
is an instance of the struct. *PMACHINELIST
is a pointer to such a struct.
Upvotes: 0