|
Then how could i modify the function??
Any suggestions??
Priya Sundar
|
|
|
|
|
Change the function return type and the string member of the struct to CString
|
|
|
|
|
I am getting error:
error C2440: 'initializing' : cannot convert from 'class CString' to 'struct _NAMES_INFO'
No constructor could take the source type, or constructor overload resolution was ambiguous
Priya Sundar
|
|
|
|
|
Priya_Sundar wrote: I am getting error:
error C2440: 'initializing' : cannot convert from 'class CString' to 'struct _NAMES_INFO'
No constructor could take the source type, or constructor overload resolution was ambiguous
Posting a compiler error message with the code that produced it is going to get you nowhere fast. What is the error telling you?
|
|
|
|
|
Priya_Sundar wrote: char* CNewDialog::ConvertResIdToChar(UINT uResString)
{
CString strTemp;
strTemp.LoadString(uResString);
char* str = strTemp.GetBuffer(strTemp.GetLength());
//str = strcpy(chTemp, (const char *) strTemp); - NOT WORKING TO FILL UP TABLE
return (str);
}
You haven't allocated the memory for char* str .
char* CNewDialog::ConvertResIdToChar(UINT uResString)
{
CString strTemp;
strTemp.LoadString(uResString);
char* str = new char[strTemp.GetLength()];
strcpy(str, (LPCTSTR) strTemp);
return (str);
}
Regards,
Paresh.
|
|
|
|
|
s have tried this.. but got problem in deallocating the memory leading to memory leaks..
Priya Sundar
|
|
|
|
|
I dont see any issue in this.
Could you please post your code snippet ?
Regards,
Paresh.
|
|
|
|
|
i tried this code
CString strLoad;<br />
strLoad.LoadString(IDS_PROJECT);<br />
LPTSTR lpsz = new TCHAR[strLoad.GetLength()+1];<br />
CHECK_FOR_NULL(lpsz)<br />
_tcscpy(lpsz,strLoad);
In Debug mode, while the function exits i get the memory leak for the new operator
Priya Sundar
|
|
|
|
|
Priya_Sundar wrote: CString strLoad;
strLoad.LoadString(IDS_PROJECT);
LPTSTR lpsz = new TCHAR[strLoad.GetLength()+1];
CHECK_FOR_NULL(lpsz)
_tcscpy(lpsz,strLoad);
I could found three ways to avoid mem leak
#1 callee itself provide the memory, and you function just to the copying task!
#2 you manually delete the memory when use of variable ends.
#3 Create the datastructure of vector or list , which contain pointer to all allocated memory and when program exit, delete all the memory pointed in vector!
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow Never mind - my own stupidity is the source of every "problem" - Mixture
cheers,
Alok Gupta
VC Forum Q&A :- I/ IV
Support CRY- Child Relief and You
|
|
|
|
|
char* CNewDialog::ConvertResIdToChar(UINT uResString)
{
CString strTemp ;
char str[MAX_SIZE] ;
strTemp.LoadString(uResString) ;
strcpy( str , strTemp.GetBuffer(strTemp.GetLength()) ) ;
return &str[0] ;
}
|
|
|
|
|
Using this function also i am not able to fill up the table correctly.
All the methods convert fine. i.e if i give a AfxMessageBox(str);, i am able to get the correct string displayed.
I think the problem is in the method of passing or in the method of initialization of the structure.
Priya Sundar
|
|
|
|
|
This is just plainly wrong. You are returning a pointer to something that is local to the function and that will be destroyed when the function goes out of scope.
The problem is that it is a very insidous bug because it will probably work but once you change something somewhere in your code, bang, you'll get a crash.
|
|
|
|
|
Okay People.....
THANKS FOR ALL YOUR COMMENTS AND SUGGESTIONS...
Finally i landed up in something like this..
hLPSTR pMyLpstr;<br />
<br />
pMyLpstr = NULL;<br />
<br />
char* CNewDialog::ConvertResIdToChar(UINT uResString)<br />
{<br />
CString strLoad; <br />
strLoad.LoadString(nResString); <br />
pMyLpstr = new TCHAR[strLoad.GetLength()+1]; <br />
CHECK_FOR_NULL(pMyLpstr)<br />
_tcscpy(pMyLpstr,strLoad); <br />
return pMyLpstr;<br />
}<br />
<br />
delete [] pMyLpstr;<br />
pMyLpstr = NULL;<br />
This is based on a idea given by Nelek in some other thread.
Priya Sundar
|
|
|
|
|
just want to be sure, is this function call only once for each ID!
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow Never mind - my own stupidity is the source of every "problem" - Mixture
cheers,
Alok Gupta
VC Forum Q&A :- I/ IV
Support CRY- Child Relief and You
|
|
|
|
|
Yes, For every string ID i call this function for the required conversion. I am deallocating the memory only last in the destructor.
This gave me no memory leak warnings in the debug window, however, logically i am deallocating it only once at the last.. what about the memory allocated for the remaining strings...
I dont know why such memory leaks are not identified by the editor..
Hope what i am talking is correct!
Priya Sundar
|
|
|
|
|
please confirm me,
#1 There is separate variable for each function request for StringID
#2 How many times this function is called for same String ID.
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow Never mind - my own stupidity is the source of every "problem" - Mixture
cheers,
Alok Gupta
VC Forum Q&A :- I/ IV
Support CRY- Child Relief and You
|
|
|
|
|
ThatsAlok wrote: #1 There is separate variable for each function request for StringID
There is no any separate variable. And i have large no of strings in the resource, using which i need to fill up my structre(which you can see in the code snippet). So to retrieve those from the string table, i need to convert the stringid.
ThatsAlok wrote: #2 How many times this function is called for same String ID.
Only once, so as to convert it and fill up the table strTagName variable value in the structure.
Priya Sundar
|
|
|
|
|
This just looks SO bad. I'm not really sure what will happen but I suspect that it has potential for the Coding Horrors forum.
When the NamesTable[] array is initialised, each NameInfo::strTagName pointer will be set to pMyLpstr , there will be no copying / storage of the string you obtained from the resource.
Peter
"Until the invention of the computer, the machine gun was the device that enabled humans to make the most mistakes in the smallest amount of time."
|
|
|
|
|
Your "solution" is all wrong. If ConvertResIdToChar() is called 10 times, yet CNewDialog 's destructor is only called once, you can see there is going to be an obvious (9x) memory leak.
"Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
Priya_Sundar wrote: char* strTagName;
Does this member have to be a char* , or can it be a CString object?
Another solution might be:
struct NAME_INFO
{
char* strTagName;
BOOL bAlwaysCreate;
NAME_INFO(int nID, BOOL bCreate)
{
CString str;
str.LoadString(nID);
strTagName = new char[str.GetLength() + 1];
strcpy(strTagName, str);
bAlwaysCreate = bCreate;
}
};
CArray<NAME_INFO*, NAME_INFO*> NamesTable;
NamesTable.Add(new NAME_INFO(IDS_PRIYA, true));
NamesTable.Add(new NAME_INFO(IDS_NISHA, true));
NamesTable.Add(new NAME_INFO(IDS_RAM, true));
NamesTable.Add(new NAME_INFO(IDS_RAJ, true));
NamesTable.Add(new NAME_INFO(IDS_RAHUL, true));
"Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
<br />
NamesTable.Add(new NAME_INFO(IDS_PRIYA, true));<br />
NamesTable.Add(new NAME_INFO(IDS_NISHA, true));<br />
NamesTable.Add(new NAME_INFO(IDS_RAM, true));<br />
NamesTable.Add(new NAME_INFO(IDS_RAJ, true));<br />
NamesTable.Add(new NAME_INFO(IDS_RAHUL, true));<br />
Thankyou.
But what about deallocating the memory allocated using the new operator here?? Where should i have to deallocate that?
And in case i declare it(strTagName) as CString object, then i am not able to directly initialize values for them, as i have this structure as a global one. I get the error as:
error C2440: 'initializing' : cannot convert from 'class CString' to 'struct _TAGS_INFO' No constructor could take the source type, or constructor overload resolution was ambiguous
So for convenience i put it as char*.
Priya Sundar
|
|
|
|
|
Priya_Sundar wrote: And in case i declare it(strTagName) as CString object, then i am not able to directly initialize values for them, as i have this structure as a global one. I get the error as:
error C2440: 'initializing' : cannot convert from 'class CString' to 'struct _TAGS_INFO' No constructor could take the source type, or constructor overload resolution was ambiguous
So for convenience i put it as char*.
struct NAME_INFO
{
CString strTagName;
BOOL bAlwaysCreate;
NAME_INFO(int nID, BOOL bCreate)
{
strTagName.LoadString(nID);
bAlwaysCreate = bCreate;
}
};
"Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
Hi. I am beginner in MFC. I have a trouble about design multi forms.
I have design app in VB, create a multiforms with MDI, but when I tried to figure it out in VC 2005. I got a lot of confuse.
Can someone tell me about how to create it.
Thanks.
|
|
|
|
|
Why you dont make multiform in the VC++?
|
|
|
|
|
I want to. But how? I only know to open new/different form by using button OnFileNew.
Is there a way to create like VB?
Thanks for quick response.
|
|
|
|