|
Isn't that reversed?
Shouldn't the extern declaration be in the header and ONE "int m_foo;" instance be in a cpp
module somewhere?
Mark
"Great job, team. Head back to base for debriefing and cocktails."
(Spottswoode "Team America")
|
|
|
|
|
nope.
by doing what Nemanja suggested, every cpp file actually includes the extern declaration (so, don't define the variable, and assume that it is defined elsewhere), and stdafx.cpp is the exception, by actually declaring the global variable.
oh my !
forget it
|
|
|
|
|
Goofball
"Great job, team. Head back to base for debriefing and cocktails."
(Spottswoode "Team America")
|
|
|
|
|
I tried it both ways and it worked the same. Since the header file looked like this, the variable was only declared once.
Like I said, Nemanja's way is cleaner as it only involves two changes, rather than multiple changes depending on how many places use the "global" variable.
"Approved Workmen Are Not Ashamed" - 2 Timothy 2:15
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|
OK I assumed stdafx was used in the normal way - as a PCH included in every module. Which
would make a separate instance for every module, right?
"Great job, team. Head back to base for debriefing and cocktails."
(Spottswoode "Team America")
|
|
|
|
|
This will produce link errors because every .CPP file will have a definition of the variable m_foo .
Steve
|
|
|
|
|
Stephen Hewitt wrote: This will produce link errors...
It doesn't.
"Approved Workmen Are Not Ashamed" - 2 Timothy 2:15
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|
Are we talking about the same thing? It seems it does[^].
Steve
|
|
|
|
|
There's probably no link error because the scope of each m_foo is contained to each cpp module.
The real problem that I see is that it's not a single global variable.
Mark
"If you can dodge a wrench, you can dodge a ball."
|
|
|
|
|
In stdafx.h:
extern int foo;
And, in stdafx.cpp:
int foo;
|
|
|
|
|
In your "StdAfx.h":
extern int m_foo;
The extern makes it a declaration and not a definition.
In one .CPP file somewhere (you could use the "StdAfx.cpp"):
int m_foo;
This is the definition.
Steve
|
|
|
|
|
Thank you for your great comments. I have made the changes with the results that I originally asked for.
|
|
|
|
|
Hi,
//i have this:
char **Temp;
Temp = (char **)malloc(sizeof(char *));
*Temp = (char *)malloc(MAX_LIST);
//ok... now i want free the allocate memory...with..
free(Temp); <== Ok This work
free(*Temp); <== this NOT work
have you got an idea???
thanks a lot...
Raiz82
|
|
|
|
|
revert the order...
free(*Temp);
free(Temp);
btw, are you coding in C or C++ ? because, if C++, then you'd better use new/delete (or new[]/delete[])
|
|
|
|
|
i use C++,
but i had reverted the order too.... but don't work...
this is the complete code of this section...
char **Temp;
Temp = (char **)malloc(sizeof(char *));
*Temp = (char *)malloc(MAX_LIST);
DWORD size = MAX_LIST;
CString sTemp,sTemp2;
if (RegQueryValueEx(pParentWnd->m_ListKey, RSS_KEY,0,NULL,(unsigned char *)*Temp,&size) == ERROR_SUCCESS)
{
//Temp[size] = '\0';
while(**Temp != '\0')
{
sTemp = strsepRss(Temp,';');
m_cRss1Combo.AddString(sTemp);
m_cRss2Combo.AddString(sTemp);
}
m_cRss1Combo.SetCurSel(0);
m_cRss2Combo.SetCurSel(1);
}
else
{
m_cRss1Combo.AddString(ECHO_LINK);
m_cRss2Combo.AddString(ECHO_LINK);
m_cRss1Combo.SetCurSel(0);
m_cRss2Combo.SetCurSel(0);
}
//posiziona i due combo box sul rss precedentemente salvato
if((m_cRss1Combo.FindStringExact(-1,pParentWnd->m_sRss1)) != -1)
m_cRss1Combo.SetCurSel(m_cRss1Combo.FindStringExact(-1,pParentWnd->m_sRss1));
if((m_cRss2Combo.FindStringExact(-1,pParentWnd->m_sRss2)) != -1)
m_cRss2Combo.SetCurSel(m_cRss2Combo.FindStringExact(-1,pParentWnd->m_sRss2));
UpdateString(pParentWnd->m_iVisualizationControl);
free(*Temp);//giulio
free(Temp);
but i don't understand....
Help me!!! ehhehehehehehhe
bye
|
|
|
|
|
Ing.Raiz82 wrote: if (RegQueryValueEx(pParentWnd->m_ListKey, RSS_KEY,0,NULL,(unsigned char *)*Temp,&size) == ERROR_SUCCESS)
Have you tried:
BYTE Temp[1024];
DWORD size = sizeof(Temp);
if (RegQueryValueEx(pParentWnd->m_ListKey, RSS_KEY, 0, NULL, Temp, &size) == ERROR_SUCCESS)
...
"Approved Workmen Are Not Ashamed" - 2 Timothy 2:15
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|
thanks for the interest.... but... if i change this....
/*
char **Temp;
Temp = (char **)malloc(sizeof(char *));
*Temp = (char *)malloc(MAX_LIST);
DWORD size = MAX_LIST;
*/
BYTE Temp[1024];
DWORD size = sizeof(Temp);
CString sTemp,sTemp2;
if (RegQueryValueEx(pParentWnd->m_ListKey, RSS_KEY,0,NULL,Temp,&size) == ERROR_SUCCESS)
{
//Temp[size] = '\0';
while(**Temp != '\0')
{
sTemp = strsepRss(Temp,';'); <==
////////////////Problem////////////////////
i have problem here because strsepRss ask char ** stringp
//////////////////////////////////////////
m_cRss1Combo.AddString(sTemp);
m_cRss2Combo.AddString(sTemp);
}
m_cRss1Combo.SetCurSel(0);
m_cRss2Combo.SetCurSel(1);
}
else
{
m_cRss1Combo.AddString(ECHO_LINK);
m_cRss2Combo.AddString(ECHO_LINK);
m_cRss1Combo.SetCurSel(0);
m_cRss2Combo.SetCurSel(0);
}
//posiziona i due combo box sul rss precedentemente salvato
if((m_cRss1Combo.FindStringExact(-1,pParentWnd->m_sRss1)) != -1)
m_cRss1Combo.SetCurSel(m_cRss1Combo.FindStringExact(-1,pParentWnd->m_sRss1));
if((m_cRss2Combo.FindStringExact(-1,pParentWnd->m_sRss2)) != -1)
m_cRss2Combo.SetCurSel(m_cRss2Combo.FindStringExact(-1,pParentWnd->m_sRss2));
UpdateString(pParentWnd->m_iVisualizationControl);
//free(*Temp);//giulio
free(Temp);
sorry but i'm a novice of c++...
thanks still...
Giulio
|
|
|
|
|
Ing.Raiz82 wrote: i have problem here because strsepRss ask char ** stringp
So just use strtok() .
Or, since you are using MFC, use a CString object, and AfxExtractSubString() .
"Approved Workmen Are Not Ashamed" - 2 Timothy 2:15
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|
thanks you so much... now work...
sorry for the time...
thanks
Giulio
|
|
|
|
|
1) you don't initialize the memory allocated
2) please use new[] /delete[] instead of malloc() /free()
3) prefer using containers such as std::vector if you need dynamic arrays (good for arrays of arrays too)
4) please also use <pre></pre> tags when posting code blocks
-- modified at 11:29 Wednesday 21st March, 2007
|
|
|
|
|
Ing.Raiz82 wrote: but i don't understand....
Do you really required double pointer???
looking at code, I don't think so it is required.
You could use single pointer to do same job.
Knock out 't' from can't,
You can if you think you can
|
|
|
|
|
Generally allocation of memory is from TOP-to-BOTTOM approch. and deallocation of memory is BOTTOM-to-TOP approch.
Allocate => parent -> child -> subchild.<br />
Deallocate => subchild -> child ->parent.
if you deallocate parent first, then it looses the reference to child and finally subchild also which will leads to memory leaks.
Knock out 't' from can't,
You can if you think you can
|
|
|
|
|
Hello!
I have now try to find information about changing font and color on a specific item in a listbox without succeed.
I find a "turtorial" on http://www.codersource.net/mfc_clistbox_font.html witch is describing exactly how to make a function cald MyListbox whitch change the font and color of a item in a listbox.
The problem is... I dont have any ide how to use it? Is it anybody who can help me get this function working and I will be very happy!
How do a declare declare LPDRAWITEMSTRUCT?
Thank you all!
//Anders
|
|
|
|
|
How can I convert the content of a CString object into
a "const char *" type in a VS2005 UNICODE MFC application?
In VS6 there were only CString class... now, in VS2005,
developing UNICODE projects, is still good to use CString
or is better use CStringW or CStringT ?
Thanks a lot !
|
|
|
|
|
use CString. it is a conveniant shortcut to either CStringA (ansi builds) or CStringW (unicode builds).
with this, always use _T() marco around your litteral strings.
and to convert from a CString object, use the LPCTSTR (or LPTSTR if constness is too much), mixed if needed with conversion macros such as T2W, T2A, CT2W, CT2A, etc... (Clikety[^])
|
|
|
|