An struct declared within another struct.
-
Hi, I have an structure declared in the .h file.
typedef struct
{
int nID;
TCHAR szName[MAX_PATH];
}MyStruct1;//I declare a list of MyStruct1 object with a key of type TCHAR as below.
typedef std::map, MyStruct1> MyStructList;Another struct which contains the MyStructList list as it's member.
typedef struct
{
int age;
TCHAR Place[MAX_PATH];
MyStructList ObjList;
}MyMainStruct;In the .cpp file.
void MyApp::main()
{
MyMainStruct objMainStruct;
UpdateList( objMainStruct.ObjList);
}//The list is being updated in this function below.
void MyApp::UpdateList(MyStructList &ObjList)
{
MyStruct1 MyStructObj;
_tcscpy(MyStructObj.szName, _T("ABCDE"));
MyStructObj.nID = 2532;
ObjList.Insert(MyStructList::value_type(_T("First"), MyStructObj)).second;
//fill this list with multiple MyStruct1 object and unique keys.
}I am not able to update the MyStructList list structure in the function below. When I perform an insert on the list or for that matter any operation on the list, my application (VC2005 on vista) crashes. Is it because the way I have declared an List object inside another structure that this is not working? Plesae help me there.
-
Hi, I have an structure declared in the .h file.
typedef struct
{
int nID;
TCHAR szName[MAX_PATH];
}MyStruct1;//I declare a list of MyStruct1 object with a key of type TCHAR as below.
typedef std::map, MyStruct1> MyStructList;Another struct which contains the MyStructList list as it's member.
typedef struct
{
int age;
TCHAR Place[MAX_PATH];
MyStructList ObjList;
}MyMainStruct;In the .cpp file.
void MyApp::main()
{
MyMainStruct objMainStruct;
UpdateList( objMainStruct.ObjList);
}//The list is being updated in this function below.
void MyApp::UpdateList(MyStructList &ObjList)
{
MyStruct1 MyStructObj;
_tcscpy(MyStructObj.szName, _T("ABCDE"));
MyStructObj.nID = 2532;
ObjList.Insert(MyStructList::value_type(_T("First"), MyStructObj)).second;
//fill this list with multiple MyStruct1 object and unique keys.
}I am not able to update the MyStructList list structure in the function below. When I perform an insert on the list or for that matter any operation on the list, my application (VC2005 on vista) crashes. Is it because the way I have declared an List object inside another structure that this is not working? Plesae help me there.
I am surprised that even compiles. It should be :
void MyApp::UpdateList( MyStructList &objList )
{
MyStruct1 myStructObj;
_tcscpy( myStructObj.szName, _T("ABCDE") );
myStructObj.nID = 2532;
// fill this list with multiple MyStruct1 object and unique keys.
objList.Insert( MyStructList::value_type( _T("First"), myStructObj ) ).second;
} -
I am surprised that even compiles. It should be :
void MyApp::UpdateList( MyStructList &objList )
{
MyStruct1 myStructObj;
_tcscpy( myStructObj.szName, _T("ABCDE") );
myStructObj.nID = 2532;
// fill this list with multiple MyStruct1 object and unique keys.
objList.Insert( MyStructList::value_type( _T("First"), myStructObj ) ).second;
}I believe, when I create an instance of MyMainStruct object, the memory is not getting allocated to the MyStructList member. Is my understanding right? If so how do i get about it? I dont want to create any object on the heap and store it's pointer in the structure.
-
Hi, I have an structure declared in the .h file.
typedef struct
{
int nID;
TCHAR szName[MAX_PATH];
}MyStruct1;//I declare a list of MyStruct1 object with a key of type TCHAR as below.
typedef std::map, MyStruct1> MyStructList;Another struct which contains the MyStructList list as it's member.
typedef struct
{
int age;
TCHAR Place[MAX_PATH];
MyStructList ObjList;
}MyMainStruct;In the .cpp file.
void MyApp::main()
{
MyMainStruct objMainStruct;
UpdateList( objMainStruct.ObjList);
}//The list is being updated in this function below.
void MyApp::UpdateList(MyStructList &ObjList)
{
MyStruct1 MyStructObj;
_tcscpy(MyStructObj.szName, _T("ABCDE"));
MyStructObj.nID = 2532;
ObjList.Insert(MyStructList::value_type(_T("First"), MyStructObj)).second;
//fill this list with multiple MyStruct1 object and unique keys.
}I am not able to update the MyStructList list structure in the function below. When I perform an insert on the list or for that matter any operation on the list, my application (VC2005 on vista) crashes. Is it because the way I have declared an List object inside another structure that this is not working? Plesae help me there.
Please, first fix the typos. For instance, you are missing a < character on the map declaration so we can't see the type you are using as a key. If you are using a TCHAR*, then review what we discussed yesterday, because it won't work. Use a std::string or std::wstring instead (because of the comparison operator that won't work for a TCHAR*). Second, if you have a crash, it is very helpfull if you provide the exact location of the crash in your code (using the call stack from the debugger) and any other assert message that you get. Third, the way you use the insert (and not Insert function) is a bit akward: why are you accessing the return value (you write a .second at the end) ? The insert function returns an iterator (the place where your data was inserted), why do you access this iterator ? It doesn't make any sense and makes the code difficult to understand. Furthermore, you I find easier to use the [] operator directly:
ObjList[_T("First")] = MyStrucObj;
Anyway, as said yesterday, your problem certainly comes from the fact that you are using TCHAR* as key for the map. Please, consider seriously using a string wrapper class instead, or you will make your life a hell for nothing.Cédric Moonen Software developer
Charting control [v1.5] OpenGL game tutorial in C++ -
I believe, when I create an instance of MyMainStruct object, the memory is not getting allocated to the MyStructList member. Is my understanding right? If so how do i get about it? I dont want to create any object on the heap and store it's pointer in the structure.
The only flaw I could see is having an implicit cast from CONST TCHAR* into TCHAR*. However, even in this case the code may work. Are you sure the reason of your crash is inside the map::insert? My quick suggestion is trying the code by declaring the map's key as CONST TCHAR* instead. -- Arman
-
Hi, I have an structure declared in the .h file.
typedef struct
{
int nID;
TCHAR szName[MAX_PATH];
}MyStruct1;//I declare a list of MyStruct1 object with a key of type TCHAR as below.
typedef std::map, MyStruct1> MyStructList;Another struct which contains the MyStructList list as it's member.
typedef struct
{
int age;
TCHAR Place[MAX_PATH];
MyStructList ObjList;
}MyMainStruct;In the .cpp file.
void MyApp::main()
{
MyMainStruct objMainStruct;
UpdateList( objMainStruct.ObjList);
}//The list is being updated in this function below.
void MyApp::UpdateList(MyStructList &ObjList)
{
MyStruct1 MyStructObj;
_tcscpy(MyStructObj.szName, _T("ABCDE"));
MyStructObj.nID = 2532;
ObjList.Insert(MyStructList::value_type(_T("First"), MyStructObj)).second;
//fill this list with multiple MyStruct1 object and unique keys.
}I am not able to update the MyStructList list structure in the function below. When I perform an insert on the list or for that matter any operation on the list, my application (VC2005 on vista) crashes. Is it because the way I have declared an List object inside another structure that this is not working? Plesae help me there.
If you are not yet convinced about using a std::string as a key, here[^] is a discussion about a guy having issues because he is using a char* as key for the map. I'm almost sure that your problem is because of that (maybe not the crash but at least your program won't work at all the way you would expect it). Just because it compiles doesn't mean that your code is correct. Just because it compiles with a TCHAR* as key doesn't mean that it is valid.
Cédric Moonen Software developer
Charting control [v1.5] OpenGL game tutorial in C++ -
The only flaw I could see is having an implicit cast from CONST TCHAR* into TCHAR*. However, even in this case the code may work. Are you sure the reason of your crash is inside the map::insert? My quick suggestion is trying the code by declaring the map's key as CONST TCHAR* instead. -- Arman
Arman Z. Sahakyan wrote:
The only flaw I could see
Well, see my other post. How is the map comparing the keys ? Using a ==operator. Now, what happens if you compare two TCHAR* strings using a == operator ? The addresses are compared, not the contents. Thus you will end up with crazy results if you don't use a comparison function like strcmp. The map doesn't know that it has to use such function to compare the keys, thus it will compare simply the pointers and you end up with unexpected results.
Cédric Moonen Software developer
Charting control [v1.5] OpenGL game tutorial in C++ -
Arman Z. Sahakyan wrote:
The only flaw I could see
Well, see my other post. How is the map comparing the keys ? Using a ==operator. Now, what happens if you compare two TCHAR* strings using a == operator ? The addresses are compared, not the contents. Thus you will end up with crazy results if you don't use a comparison function like strcmp. The map doesn't know that it has to use such function to compare the keys, thus it will compare simply the pointers and you end up with unexpected results.
Cédric Moonen Software developer
Charting control [v1.5] OpenGL game tutorial in C++std::map uses operator ==?? I think no. It uses std::less predicate which uses operator < by default. And for string pointers it's common to use them as keys because identical strings are stored in the same location and different strings (I mean const char* ) in different. But surely, I'd chose std::string as a more modern (and event more) alternative to those const char pointers!
-- Arman
-
std::map uses operator ==?? I think no. It uses std::less predicate which uses operator < by default. And for string pointers it's common to use them as keys because identical strings are stored in the same location and different strings (I mean const char* ) in different. But surely, I'd chose std::string as a more modern (and event more) alternative to those const char pointers!
-- Arman
Arman Z. Sahakyan wrote:
std::map uses operator ==?? I think no.
Honnestly, I don't exactly what it uses internally, but it uses an arithmetic operator anyway (operator < for instance). And this is not really nice working with pointers :)
Arman Z. Sahakyan wrote:
And for string pointers it's common to use them as keys because identical strings are stored in the same location
No, not necessarily. Otherwise you wouldn't need a strcmp function :) . I guess it's okay if you are using static strings but once you start maniuplating those strings and copying to another TCHAR pointer, then everything is screwed. And you certainly want to use something else than just the same TCHAR pointer for your key.
Cédric Moonen Software developer
Charting control [v1.5] OpenGL game tutorial in C++ -
If you are not yet convinced about using a std::string as a key, here[^] is a discussion about a guy having issues because he is using a char* as key for the map. I'm almost sure that your problem is because of that (maybe not the crash but at least your program won't work at all the way you would expect it). Just because it compiles doesn't mean that your code is correct. Just because it compiles with a TCHAR* as key doesn't mean that it is valid.
Cédric Moonen Software developer
Charting control [v1.5] OpenGL game tutorial in C++I am not sure if you guys understand the issue that I am facing.
typedef struct
{
int nID;
TCHAR szName[MAX_PATH];
}MyStruct1;//I declare a list of MyStruct1 object with a key of type TCHAR as below.
typedef std::map, MyStruct1> MyStructList;
Another struct which contains the MyStructList list as it's member.
typedef struct
{
int age;
TCHAR Place[MAX_PATH];
MyStructList ObjList;
}MyMainStruct;//This code gives a crash.
void MyApp::UpdateList(MyStructList &ObjList)
{
ObjList.clear();//Even this line crashes.
MyStruct1 MyStructObj;
_tcscpy(MyStructObj.szName, _T("ABCDE"));
MyStructObj.nID = 2532;
ObjList.Insert(MyStructList::value_type(_T("First"), MyStructObj)).second;
//fill this list with multiple MyStruct1 object and unique keys.
}//But the given function adds all the structure object with their key without any crash.
void MyApp::UpdateList2()
{
MyStructList localObjList
MyStruct1 MyStructObj;
_tcscpy(MyStructObj.szName, _T("ABCDE"));
MyStructObj.nID = 2532;
localObjList.Insert(MyStructList::value_type(_T("First"), MyStructObj)).second;
//fill this list with multiple MyStruct1 object and unique keys.
}Which means that there is nothing wrong with the insert operation that is performed on the localObjList list object which is a local copy. when I create an instance of MyMainStruct object, will the MyStructList member of MyMainStruct also be instantiated. void main() { MyMainStruct MainObj; UpdateList(MainObj.objMyStructList);//This call crashes. }
modified on Friday, February 13, 2009 3:22 AM
-
I am not sure if you guys understand the issue that I am facing.
typedef struct
{
int nID;
TCHAR szName[MAX_PATH];
}MyStruct1;//I declare a list of MyStruct1 object with a key of type TCHAR as below.
typedef std::map, MyStruct1> MyStructList;
Another struct which contains the MyStructList list as it's member.
typedef struct
{
int age;
TCHAR Place[MAX_PATH];
MyStructList ObjList;
}MyMainStruct;//This code gives a crash.
void MyApp::UpdateList(MyStructList &ObjList)
{
ObjList.clear();//Even this line crashes.
MyStruct1 MyStructObj;
_tcscpy(MyStructObj.szName, _T("ABCDE"));
MyStructObj.nID = 2532;
ObjList.Insert(MyStructList::value_type(_T("First"), MyStructObj)).second;
//fill this list with multiple MyStruct1 object and unique keys.
}//But the given function adds all the structure object with their key without any crash.
void MyApp::UpdateList2()
{
MyStructList localObjList
MyStruct1 MyStructObj;
_tcscpy(MyStructObj.szName, _T("ABCDE"));
MyStructObj.nID = 2532;
localObjList.Insert(MyStructList::value_type(_T("First"), MyStructObj)).second;
//fill this list with multiple MyStruct1 object and unique keys.
}Which means that there is nothing wrong with the insert operation that is performed on the localObjList list object which is a local copy. when I create an instance of MyMainStruct object, will the MyStructList member of MyMainStruct also be instantiated. void main() { MyMainStruct MainObj; UpdateList(MainObj.objMyStructList);//This call crashes. }
modified on Friday, February 13, 2009 3:22 AM
Comp_Users wrote:
I am not sure if you guys understand the issue that I am facing.
You didn't explain it this way last time, so no I didn't know that it was crashing on clear (you said it was crashing on insert). Anyway, there's something important that you have to understant is that your code is 'broken' and you can end up with unexpected results. First, take some time to fix the issue with your key in the map, chances are that the problem will be solved. If that's not the case, then we can look at a code that is a bit cleaner and try to narrow the problem. Now, there's just too many issues with your code.
Cédric Moonen Software developer
Charting control [v1.5] OpenGL game tutorial in C++