CArray makes me cry !!!!!!!
-
Hi dear João :) And thanks alot for reply, You are the only one who helps me :) :rose: Well, m_MrOdd is the member variable (public access) of CMyDialog class. As you said I changed the m_MrOdd declaring to:
CArray < SomeStruct, SomeStruct& > m_MrOdd;
But I've still the problem :( Best Regards, HadiCan you please show the definition of SomeStruct? It may be important... Regards, João Paulo Figueira Embedded MVP
-
Can you please show the definition of SomeStruct? It may be important... Regards, João Paulo Figueira Embedded MVP
It's the real structure:
struct OrderItems { OrderItems(){} OrderItems(int code, int count) { m_nCode = code; m_nCount = count; } int m_nCode; int m_nCount; };
Best Regards, Hadi -
It's the real structure:
struct OrderItems { OrderItems(){} OrderItems(int code, int count) { m_nCode = code; m_nCount = count; } int m_nCode; int m_nCount; };
Best Regards, HadiThis is really strange because it should be working on such a simple structure (no need for complex copy semantics). Let me think a little bit... Regards, João Paulo Figueira Embedded MVP
-
It's the real structure:
struct OrderItems { OrderItems(){} OrderItems(int code, int count) { m_nCode = code; m_nCount = count; } int m_nCode; int m_nCount; };
Best Regards, HadiWhat is the value of
GetUpperBound
? Regards, João Paulo Figueira Embedded MVP -
Hi :( I have a very odd problem that made me really crazy ! :eek: I've an member variable in my dialog class:
public: CArray < SomeStruct, SomeStruct > m_MrOdd;
In a function I added some values to m_MrOdd, like this:void CMyDialog::SomeFunc1() { m_MrOdd.Add( SomeStruct( 1, 2 ) ); m_MrOdd.Add( SomeStruct( 10, 2 ) ); m_MrOdd.Add( SomeStruct( 1, 212 ) ); }
And when i want to use of values, the array show me nothing !void CMyDialog::SomeFunc2() { if(m_MrOdd.GetSize() == 0) MessageBox( _T("What did you do with my array ?!!!!!!") ); . . . }
I don't know what to do ... plz help me. The intresting part is when i debug the program ;P In Adding values, it shows that everything is ok and in using data in another function it shows there is not any value :(( Regards, HadiGot it! Most of the times, we have to read MFC's source code to know whais is happening. Look:
AFX_INLINE int CArray<TYPE, ARG_TYPE>::Add(ARG_TYPE newElement)
{ int nIndex = m_nSize;
SetAtGrow(nIndex, newElement);
return nIndex; }
.
.
.
template<class TYPE, class ARG_TYPE>
void CArray<TYPE, ARG_TYPE>::SetAtGrow(int nIndex, ARG_TYPE newElement)
{
ASSERT_VALID(this);
ASSERT(nIndex >= 0);if (nIndex >= m\_nSize) SetSize(nIndex+1, -1); m\_pData\[nIndex\] = newElement;
}
The code is using a reference type (
ARG_TYPE
) to add the objects, that you are passing as unnamed temporaries (when are these being deleted?). Try something like this:void CMyDialog::SomeFunc1()
{
SomeStruct a(0,0);a = SomeStruct( 1, 2 );
m_MrOdd.Add( a );a = SomeStruct( 10, 2 );
m_MrOdd.Add( a );a = SomeStruct( 1, 212 );
m_MrOdd.Add( a );
}I know it looks odd, but try it. Regards, João Paulo Figueira Embedded MVP
-
What is the value of
GetUpperBound
? Regards, João Paulo Figueira Embedded MVPIn Adding Function (I added 2 items to array): GetSize() is 2, and GetUpperBound() is 1 In Using Function: GetSize() is 0, and GetUpperBound() is -1 Best Regards, Hadi
-
In Adding Function (I added 2 items to array): GetSize() is 2, and GetUpperBound() is 1 In Using Function: GetSize() is 0, and GetUpperBound() is -1 Best Regards, Hadi
Are you absolutely sure that the functions are called in this order? By any chance are you not clearing the array between the calls? (this is weired) Regards, João Paulo Figueira Embedded MVP
-
Got it! Most of the times, we have to read MFC's source code to know whais is happening. Look:
AFX_INLINE int CArray<TYPE, ARG_TYPE>::Add(ARG_TYPE newElement)
{ int nIndex = m_nSize;
SetAtGrow(nIndex, newElement);
return nIndex; }
.
.
.
template<class TYPE, class ARG_TYPE>
void CArray<TYPE, ARG_TYPE>::SetAtGrow(int nIndex, ARG_TYPE newElement)
{
ASSERT_VALID(this);
ASSERT(nIndex >= 0);if (nIndex >= m\_nSize) SetSize(nIndex+1, -1); m\_pData\[nIndex\] = newElement;
}
The code is using a reference type (
ARG_TYPE
) to add the objects, that you are passing as unnamed temporaries (when are these being deleted?). Try something like this:void CMyDialog::SomeFunc1()
{
SomeStruct a(0,0);a = SomeStruct( 1, 2 );
m_MrOdd.Add( a );a = SomeStruct( 10, 2 );
m_MrOdd.Add( a );a = SomeStruct( 1, 212 );
m_MrOdd.Add( a );
}I know it looks odd, but try it. Regards, João Paulo Figueira Embedded MVP
I tried this way:
OrderItems item(0, 0); item = OrderItems( 10, 96 ); m_OrderItems.Add( item ); item = OrderItems( 5, 13 ); m_OrderItems.Add( item );
But ...... :( Regards, Hadi -
Are you absolutely sure that the functions are called in this order? By any chance are you not clearing the array between the calls? (this is weired) Regards, João Paulo Figueira Embedded MVP
Yes, I'm sure ... As you can see the code is so simple, and I didn't clear any item ... Best Regards, Hadi
-
I tried this way:
OrderItems item(0, 0); item = OrderItems( 10, 96 ); m_OrderItems.Add( item ); item = OrderItems( 5, 13 ); m_OrderItems.Add( item );
But ...... :( Regards, HadiMan, this is maddening! What SDK are you using? Regards, João Paulo Figueira Embedded MVP
-
Got it! Most of the times, we have to read MFC's source code to know whais is happening. Look:
AFX_INLINE int CArray<TYPE, ARG_TYPE>::Add(ARG_TYPE newElement)
{ int nIndex = m_nSize;
SetAtGrow(nIndex, newElement);
return nIndex; }
.
.
.
template<class TYPE, class ARG_TYPE>
void CArray<TYPE, ARG_TYPE>::SetAtGrow(int nIndex, ARG_TYPE newElement)
{
ASSERT_VALID(this);
ASSERT(nIndex >= 0);if (nIndex >= m\_nSize) SetSize(nIndex+1, -1); m\_pData\[nIndex\] = newElement;
}
The code is using a reference type (
ARG_TYPE
) to add the objects, that you are passing as unnamed temporaries (when are these being deleted?). Try something like this:void CMyDialog::SomeFunc1()
{
SomeStruct a(0,0);a = SomeStruct( 1, 2 );
m_MrOdd.Add( a );a = SomeStruct( 10, 2 );
m_MrOdd.Add( a );a = SomeStruct( 1, 212 );
m_MrOdd.Add( a );
}I know it looks odd, but try it. Regards, João Paulo Figueira Embedded MVP
I forgot to say that i got thease warnings in compiling:
e:\windows ce tools\wce420\pocket pc 2003\mfc\include\afxtempl.h(65) : warning C4291: 'void *__cdecl operator new(unsigned int,void *)' : no matching operator delete found; memory will not be freed if initialization throws an exception e:\windows ce tools\wce420\pocket pc 2003\mfc\include\wcealt.h(235) : see declaration of 'new' e:\windows ce tools\wce420\pocket pc 2003\mfc\include\afxtempl.h(334) : see reference to function template instantiation 'void __cdecl ConstructElements(class OrderItems *,int)' being compiled OrderListDialog.cpp e:\windows ce tools\wce420\pocket pc 2003\mfc\include\afxtempl.h(65) : warning C4291: 'void *__cdecl operator new(unsigned int,void *)' : no matching operator delete found; memory will not be freed if initialization throws an exception e:\windows ce tools\wce420\pocket pc 2003\mfc\include\wcealt.h(235) : see declaration of 'new' e:\windows ce tools\wce420\pocket pc 2003\mfc\include\afxtempl.h(334) : see reference to function template instantiation 'void __cdecl ConstructElements(class OrderItems *,int)' being compiled ReportPage.cpp ShamsiDate.cpp Visitor.cpp e:\windows ce tools\wce420\pocket pc 2003\mfc\include\afxtempl.h(65) : warning C4291: 'void *__cdecl operator new(unsigned int,void *)' : no matching operator delete found; memory will not be freed if initialization throws an exception e:\windows ce tools\wce420\pocket pc 2003\mfc\include\wcealt.h(235) : see declaration of 'new' e:\windows ce tools\wce420\pocket pc 2003\mfc\include\afxtempl.h(334) : see reference to function template instantiation 'void __cdecl ConstructElements(class OrderItems *,int)' being compiled Generating Code... Linking...
-
Man, this is maddening! What SDK are you using? Regards, João Paulo Figueira Embedded MVP
Yes I know but what can i say ? :( I'm using eVC++ 4.0 SP3, PPC 2003 SDK, WinCE 4.2 SDK is also installed. PS: I just stop the project, don't know what the hell is this :( Anyway thanks alot for your time ;) :rose: Regards, Hadi
-
I forgot to say that i got thease warnings in compiling:
e:\windows ce tools\wce420\pocket pc 2003\mfc\include\afxtempl.h(65) : warning C4291: 'void *__cdecl operator new(unsigned int,void *)' : no matching operator delete found; memory will not be freed if initialization throws an exception e:\windows ce tools\wce420\pocket pc 2003\mfc\include\wcealt.h(235) : see declaration of 'new' e:\windows ce tools\wce420\pocket pc 2003\mfc\include\afxtempl.h(334) : see reference to function template instantiation 'void __cdecl ConstructElements(class OrderItems *,int)' being compiled OrderListDialog.cpp e:\windows ce tools\wce420\pocket pc 2003\mfc\include\afxtempl.h(65) : warning C4291: 'void *__cdecl operator new(unsigned int,void *)' : no matching operator delete found; memory will not be freed if initialization throws an exception e:\windows ce tools\wce420\pocket pc 2003\mfc\include\wcealt.h(235) : see declaration of 'new' e:\windows ce tools\wce420\pocket pc 2003\mfc\include\afxtempl.h(334) : see reference to function template instantiation 'void __cdecl ConstructElements(class OrderItems *,int)' being compiled ReportPage.cpp ShamsiDate.cpp Visitor.cpp e:\windows ce tools\wce420\pocket pc 2003\mfc\include\afxtempl.h(65) : warning C4291: 'void *__cdecl operator new(unsigned int,void *)' : no matching operator delete found; memory will not be freed if initialization throws an exception e:\windows ce tools\wce420\pocket pc 2003\mfc\include\wcealt.h(235) : see declaration of 'new' e:\windows ce tools\wce420\pocket pc 2003\mfc\include\afxtempl.h(334) : see reference to function template instantiation 'void __cdecl ConstructElements(class OrderItems *,int)' being compiled Generating Code... Linking...
This may well be the source of this problem. To diagnose it, I would have to take a look at your entire project. Regards, João Paulo Figueira Embedded MVP
-
This may well be the source of this problem. To diagnose it, I would have to take a look at your entire project. Regards, João Paulo Figueira Embedded MVP
Here's the story:
class OrderItems { public: OrderItems(){} OrderItems(int code, int count) { m_nCode = code; m_nCount = count; } int m_nCode; int m_nCount; }; class CMainPage : public CPropertyPage { . . . void UseOrders(); // Where we should read items. public: CArray < OrderItems, OrderItems& > m_OrderItems; }
And somewhere, in one of CMainPage methods I show another dialog and i add the items in that:void COrderListDialog::OnOK() { CMainPage* dlgMain = (CMainPage*) GetParent(); OrderItems item(0, 0); item = OrderItems( 10, 96 ); dlgMain->m_OrderItems.Add( item ); item = OrderItems( 5, 13 ); dlgMain->m_OrderItems.Add( item ); CDialog::OnOK(); }
And then when i back to Main form i call UseOrders() to read the items but the problem occrues :( I hope it's clear ... Regards, Hadi -
This may well be the source of this problem. To diagnose it, I would have to take a look at your entire project. Regards, João Paulo Figueira Embedded MVP
I did some new tests on the code that the results are strange too. 1- I declared m_OrderItems as a pointer variable and then use new, when i want to add items it shows me an error: "Out Of Memory.", But the program doesn't crash. 2- I used vector instead of CArray and i get same result. (No Item !) Regards, Hadi
-
Here's the story:
class OrderItems { public: OrderItems(){} OrderItems(int code, int count) { m_nCode = code; m_nCount = count; } int m_nCode; int m_nCount; }; class CMainPage : public CPropertyPage { . . . void UseOrders(); // Where we should read items. public: CArray < OrderItems, OrderItems& > m_OrderItems; }
And somewhere, in one of CMainPage methods I show another dialog and i add the items in that:void COrderListDialog::OnOK() { CMainPage* dlgMain = (CMainPage*) GetParent(); OrderItems item(0, 0); item = OrderItems( 10, 96 ); dlgMain->m_OrderItems.Add( item ); item = OrderItems( 5, 13 ); dlgMain->m_OrderItems.Add( item ); CDialog::OnOK(); }
And then when i back to Main form i call UseOrders() to read the items but the problem occrues :( I hope it's clear ... Regards, HadiPlease make sure that this:
CMainPage* dlgMain = (CMainPage*) GetParent();
does return the pointer you want. If not, all is explained... Regards, João Paulo Figueira Embedded MVP
-
Please make sure that this:
CMainPage* dlgMain = (CMainPage*) GetParent();
does return the pointer you want. If not, all is explained... Regards, João Paulo Figueira Embedded MVP
Yessss, That's it :-D You solved the problem ! Thank you very much ! :rose: I changed code to this:
CAppSheet *pAppSheet = (CAppSheet *) GetParent(); CMainPage *dlgMain = (CMainPage *) pAppSheet->GetPage(0);
And now it works fine ... Best Regards, Hadi