|
I took this from an online example.
using VC++ 7 if you write...
int StudentAge;<br />
<br />
<br />
cout << "Student age = " << StudentAge << endl; <br />
<br />
cout << endl;<br />
You will (rightly) get a runtime check failure since StudentAge has not been initialized.
What I'd like to know is why THIS works
int StudentAge;<br />
int* ptrAge;<br />
<br />
ptrAge = &StudentAge;<br />
<br />
cout << "Student age = " << StudentAge << endl; <br />
<br />
cout << endl;
Here I don't get a runtime check failure even though it's clear StudentAge still hasn't been initialized. I'm just curious as to why this is the case.
Thanks
Woke up this morning...and got myself a blog
|
|
|
|
|
Neither case should issue a runtime error.
The first case will issue a compiler warning (variable used without being initialized), depending on your compiler options.
The second case is sufficient to mark the variable StudentAge as having been 'touched' (by the & operator), hence the warning wouldn't be appropriate. The compiler isn't (and shouldn't be, IMO) smart enough to look for secondary effects. Perhaps the variable gets initialized as a side effect, via the pointer.
Software Zen: delete this;
|
|
|
|
|
Thanks Gary, I used the term "Runtime Check Failure" because that's what the VC++7 warning dialog says (at runtime I might add). I guess I haven't set up my IDE to warn me on such things because the compile in the first case is clean as a whistle
Thanks!!
Woke up this morning...and got myself a blog
|
|
|
|
|
Hmmm. Is this Managed C++, by any chance? I'm just curious. I write 'unmanaged' C++, and have never seen this behavior at runtime.
Software Zen: delete this;
|
|
|
|
|
|
From the compiler documentation, /RTC switch:
[quote]
/RTCu
Reports when a variable is used without having been initialized. For example, an instruction that generates C4701 may also generate a run-time error under /RTCu. Any instruction that generates C4700 will generate a run-time error under /RTCu.
However, consider the following code fragment:
int a, *b, c;
if ( 1 )
b = &a;
c = a; // no run-time error with /RTCu
If a variable could have been initialized, it will not be reported at run time by /RTCu. For example, after a variable is aliased through a pointer, the compiler will not track the variable and report uninitialized uses. In effect, you can initialize a variable by taking its address. The & operator works like an assignment operator in this situation.
[/quote]
[edit] Made attribution clearer. [/edit]
|
|
|
|
|
|
Hi,
I'm trying to make a program in C++ that calculates and prints all the potential partitions of a group of n elements to groups of k elements (n is a integer multiplicate of k).
For example if n=4, k=2 :
{{a1,a2}, {a3,a4}}
{{a1,a3}, {a2,a4}}
{{a1,a4}, {a2,a3}}
I really need an algorythm about this so if you have a suggestion or if you know any links about Discrete Mathematics Algorythms i would appreciate it.
(Sorry if my English are bad)
Paparia Mantoles!
|
|
|
|
|
is this really a math problem?
Don't try it, just do it!
|
|
|
|
|
I derived a class from CListBox. In that class I added a handler for the right mouse button. When I click the right button, the menu pops up on my desktop. I know why its doing this, because the CPoint passed to the function is relative to the whole screen, not my listbox.
I cant figure out how to tell the menu to popup where my mouse is.
I tried ScreenToClient() but it didnt work.
<br />
void CMyListBox::OnRButtonUp(UINT nFlags, CPoint point) <br />
{<br />
CMenu Menu;<br />
Menu.LoadMenu(IDR_POPUP_MENU);<br />
CMenu *Popup = Menu.GetSubMenu(0);<br />
ScreenToClient(&point);<br />
Popup->TrackPopupMenu(TPM_LEFTBUTTON|TPM_RIGHTBUTTON|TPM_LEFTALIGN, <br />
point.x, point.y, this, NULL);<br />
Menu.DestroyMenu();<br />
}<br />
Anybody help?
Thanks!
|
|
|
|
|
The point is given to you in client coords, and TrackPopupMenu() expects screen coords, so use ClientToScreen() to convert the point.
Sonork 100.11743 Chicken Little
"You're obviously a superstar." - Christian Graus about me - 12 Feb '03
Within you lies the power for good - Use it!
|
|
|
|
|
You have two problems. First, the point parameter is in window coords, not screen coords. Second, TrackPopupMenu() takes screen coords for the menu location. So you should call ClientToScreen(&point)
--Mike--
Ericahist | CP SearchBar v2.0.2 | Homepage | 1ClickPicGrabber New v2.0.1! | RightClick-Encrypt
You cannot truly appreciate Dilbert unless you've read it in the original Klingon.
|
|
|
|
|
Or you could just call
::GetCursorPos(&point);
Which will give you the current mouse position in screen coordinates
Roger Allen - Sonork 100.10016
Roger Wright: Remember to buckle up, please, and encourage your friends to do the same. It's not just about saving your life, but saving the quality of life for those you may leave behind...
|
|
|
|
|
Thanks to all of you. That worked.
|
|
|
|
|
some times MFC drives me so nuts that i use SDK procs.
CPoint cpPoint;
GetCursorPos(&cpPoint);
|
|
|
|
|
I'm trying to set a waitable timer from a CTime object. So I'm doing converstion from CTime to SYSTEMTIME then to a FILETIME and finally to a LARGE_INTEGER structure so I can pass it to SetWaitableTimer.
This compiles and runs, however my timer fires immediately every time. It's completely ignoring the time to fire on. Am I making these converstions wrong or just completely flubbing the whole thing up? I'm lost, any help would be very appreciated!!
CTime m_tNextRun(Schedule.GetNextRunTime());
SYSTEMTIME m_st_DueTime;
m_tNextRun.GetAsSystemTime(m_st_DueTime);
FILETIME m_ft_DueTime;
::SystemTimeToFileTime(&m_st_DueTime, &m_ft_DueTime);
LARGE_INTEGER m_lg_DueTime;
m_lg_DueTime.LowPart = m_ft_DueTime.dwLowDateTime;
m_lg_DueTime.HighPart = m_ft_DueTime.dwHighDateTime;
if(!::SetWaitableTimer(handles[command_timer], &m_lg_DueTime,0, NULL, NULL, 0)) {
DEBUG_LOG("CSleeperThread::run(): set waitable timer failed.");
}
::WaitForMultipleObjects(2, handles, FALSE, INFINITE);
Mike Ellertson
|
|
|
|
|
I don't see anything wrong with it. I assume you've already called CreateWaitableTimer ?
What's the return value of WaitForMultipleObjects ?
|
|
|
|
|
The return value of WaitForMultipleObjects is the index of the timer(which is what it should be).
If you look at SetWaitableTimer on MSDN the second parameter specifies the alarm date for the timer. Only thing, it's a LONG_INTEGER structure that your supposed to set using the FILETIME format.
I'm pretty sure I'm setting up this format wrong. Does anyone have a good conversion routine from a CTime object to a LONG_INTEGER used by SetWaitableTimer ? Or have any advice on setting this FILETIME format?
|
|
|
|
|
Hello,
About your article with the CSleeperThread's class and the functions :
static VOID CALLBACK TimerProc_Wrapper
VOID CALLBACK TimerProc
void ThreadMain();
void WakeUp();
How do you use those functions in the main in order to suspend the thread for 10s for example?
Thanks
Clément, french student
|
|
|
|
|
Hello,
I'm trying to *Send* a message to a Dialog Bar window early on in the initialization of an app and I believe I'm crashing because the Dialog Bar has not been created yet. How can I test to ensure it's been created and can accept & process such messages? I try to get a safe Handle (or call GetActiveWindow()), but that's valid all the time. If I change the SendMessage to a PostMessage, everything works, but I do need a SendMessage for some execution timing later in the app. Any suggestions/help?
thanks! JennyP
<code>
........
CDiagGlobalSched *gl_sched = &(((CMainFrame *)AfxGetApp()->m_pMainWnd)->m_SchedDlgBar1);
if (ForceUpdate) {
if (gl_sched->GetActiveWindow() != NULL) {
gl_sched->SendMessage(WM_COMMAND, ID_UPDATE_SCHED_BAR);
}
return TRUE;
}
</code>
|
|
|
|
|
say i have a struct like this:
<br />
<br />
typedef struct {<br />
char* text1;<br />
char* text2;<br />
...<br />
char* text25;<br />
}MYS,*PMYS;<br />
how can i access the struct like this?
<br />
PMYS pS=SomehowGetPtrToStruct();<br />
for (int i=0; i < MYS_TEXTCOUNT; i++)<br />
{<br />
char* text=pS[i];<br />
dosomething(text);<br />
}<br />
i dont want to get the items like this:
char* text=pS->text2;<br />
i also tried to do stuff like: char* text=pS+(sizeof(char*)*i); but i cant get it to work
|
|
|
|
|
If you want to use the array syntax, use an array (or a std::vector ). You could overload the [] operator for your struct if you want to obfuscate your code.
|
|
|
|
|
i dont need to use the array syntax, i just need to access the members of the struct without using the names
|
|
|
|
|
|
Message Closed
modified 20-Feb-22 19:24pm.
|
|
|
|