|
I do not understand why this is happening, however the following functions work for small numbers of data, but for larger numbers (ie 100,000 to 1,000,000) I get a stack overflow. These are protected functions of the class "Sample." Sample has a one dimensional dynamically allocated array of doubles pointed to by the m_data variable.
Any help would be appreciated because I have not been able to find a solution to this
Thanks
<br />
void Sample::quicksort(signed long int top, signed long int bottom){<br />
signed int long middle;<br />
if (top < bottom){<br />
middle = partition(top, bottom);<br />
quicksort(top, middle);<br />
quicksort(middle+1, bottom);<br />
}<br />
return;<br />
}<br />
<br />
<br />
signed long int Sample::partition(signed long int top, signed long int bottom){<br />
double x = *(m_data + top);<br />
signed long int i = top - 1;<br />
signed long int j = bottom + 1;<br />
double temp;<br />
do{<br />
do{<br />
j--;<br />
}while (x > *(m_data+j));<br />
<br />
do{<br />
i++;<br />
}while (x < *(m_data+i));<br />
if (i < j){<br />
temp = *(m_data+i);<br />
*(m_data+i) = *(m_data+j);<br />
*(m_data+j) = temp;<br />
}<br />
}while (i < j); <br />
return j;
}<br />
|
|
|
|
|
You have recursive function calls. Every time a recursive function is called, the state of the caller is pushed onto the stack so it can be popped off the stack when the called function returns in order to restore the state. You are simply running out of stack space as a result.
You may be right I may be crazy -- Billy Joel --
Within you lies the power for good, use it!!!
|
|
|
|
|
Ok. Why would that happen after a sort size of 3000 for instance????
|
|
|
|
|
Any recursive function can cause a stack overflow if it recurses too often.
JKallen wrote: signed int long middle;
Is this legal ? It's certainly redundant. Variables are signed by default, and long and int are the same, so long would have done. Why is it there, this can't be C, it's a class. You've created a variable before it needs to exist ( and when sometimes it does not ), and not given it a default value. This is very poor form.
Christian Graus - Microsoft MVP - C++
Metal Musings - Rex and my new metal blog
|
|
|
|
|
It is legal. It is only redundant on a per compiler basis. long signed int specifies for all compilers where some platforms may default to short as the old C++ compilers do,..etc. the definition is fine. in fact I changed the "ints" to short signed unsigned lnog etc,...no difference. The problem is that I am running out of stack,...what i dont get is why this happenes sorting 3000 items.
|
|
|
|
|
JKallen wrote: It is only redundant on a per compiler basis.
Yes, it's true that the standard only sets minimum sizes for variable types, a long may be bigger than an int. But I don't see how 'long' wouldn't work everywhere ?
JKallen wrote: in fact I changed the "ints" to short signed unsigned lnog etc,...no difference
I know that, I was making a general comment about the efficiency and cleanness of the code.
JKallen wrote: The problem is that I am running out of stack,...what i dont get is why this happenes sorting 3000 items.
Obviously because each call is placing two more calls on the stack, and you're running out.
What if you add a counter to the code, a static variable or something ? Perhaps the loop is running for more often than it needs to, and there's a bug in the partition code ?
Christian Graus - Microsoft MVP - C++
Metal Musings - Rex and my new metal blog
|
|
|
|
|
So. Is the message you cannot sort more than 3000 items using a quick sort algorithm? Is there a way around this limitation? ie is there a way to manage the recursive calls dynamically?
|
|
|
|
|
JKallen wrote: Is the message you cannot sort more than 3000 items using a quick sort algorithm?
No, the message is that apparently you can't do that using this particular implimentation.
JKallen wrote: ie is there a way to manage the recursive calls dynamically?
Not that I know of. I believe you can change your stack size, but this is a poor solution IMO.
Christian Graus - Microsoft MVP - C++
Metal Musings - Rex and my new metal blog
|
|
|
|
|
|
I've not ever seen top/bottom used with quicksort. I use left/right. That aside...
The reason for the endless recursion is that top is always LT bottom . See if this helps:
void Sample::quicksort( int top, int bottom )
{
if (top < bottom)
{
int nMiddle = partition(top, bottom);
quicksort(top, nMiddle<code> - 1</code>);
quicksort(nMiddle + 1, bottom);
}
}
"Money talks. When my money starts to talk, I get a bill to shut it up." - Frank
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|
|
If you are familiar with xcacls.exe (provided by Microsoft) it lets you view the NTFS access control lists for a directory. However, it only lists global (AD) security groups and doesn't know how to resolve local security groups. Example : SERVERNAME\Local_Group_01
When right clicking a folder in Windows Explorer, both local AND global groups are displayed properly.
Before I start on this and hit a potential roadblock, does anyone know if GetExplicitEntriesFromAcl ([^]will return detail about the local security groups that might be included in an ACL?
|
|
|
|
|
hopr u mentioned about cacls.exe and not xcacls.exe. cacls list both local sids and domain sids. tahts how it works. alternatively u can use GetExplicitEntriesFromAcl as well. I donno why it displays only domain sids in ur case?
cheers..Milton Kb
|
|
|
|
|
Can someone help me my problem?
How can do i compare two images?? what i need is just a simple comparison... E.g. After both images are being compared, a message will say either "correct" or "wrong" that's all....
Thanks,
Best Regards....
|
|
|
|
|
You can load them into a DC and use GetPixel, but it's much faster if you can make them a DIBSEction, and then you can access the image data as a byte array and compare it.
Christian Graus - Microsoft MVP - C++
Metal Musings - Rex and my new metal blog
|
|
|
|
|
The easiest way is to use GetDIBits() on each bitmap and do a memcmp() on the image data.
You may be right I may be crazy -- Billy Joel --
Within you lies the power for good, use it!!!
|
|
|
|
|
can you send me the code for comparing 2 images
|
|
|
|
|
I think i see an article in http://www.codeguru.com[^] for compare two images,yesterday?i want to send you address this article but i dont know its name.
|
|
|
|
|
Hi guys.
Now I'm making IE tool bar, like google tool bar, wanting to use both Japanese and English.
Anyone help me out with AtlEscapeUrl by using multibyte code.
following is my source...
============================================================================================
LRESULT CBandToolBarCtrl::OnVarableLink2(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
CString ss = "";
switch(m_nCurrentConfigInfo)
{
case ButtonInfo:
ss = (LPCSTR)m_ptConfigInfo->m_ptButtonInfo[m_nCurrentConfigIdx].URL;
break;
case MenuInfo:
ss = (LPCSTR)m_ptConfigInfo->m_ptMenuItem[m_nCurrentConfigIdx].URL;
break;
}
TCHAR cValue1[1024];
TCHAR cValue2[1024];
m_ctlBandComboBox.GetWindowText(cValue1, sizeof(cValue1));
m_ctlBandComboBox.Process(cValue1);
CString sSJIS = cValue1;
CString sEUC;
int ires;
LPWSTR wbuf;
LPSTR putf;
ires = MultiByteToWideChar(CP_ACP, 0, cValue1, -1, NULL, NULL);
wbuf = new WCHAR[ires+1];
ires = MultiByteToWideChar(CP_ACP, 0, cValue1, -1, wbuf, ires);
strcpy_s(cValue2,cValue1);
switch (m_eURLCode)
{
case ConvSJIS:
break;
case ConvEUCJP:
sEUC = SJIStoEUC(sSJIS);
strcpy_s(cValue2, sEUC);
break;
case ConvUTF8:
// checking buffer size
ires = WideCharToMultiByte(CP_UTF8, 0, wbuf, -1, NULL, 0, NULL, NULL);
if (ires > 0)
{
putf = new char[ires+1];
ires = WideCharToMultiByte(CP_UTF8, 0, wbuf, -1, putf, ires, NULL, NULL);
if (ires > 0)
{
putf[ires] = 0;
strcpy_s(cValue2, putf);
}
delete [] putf;
}
break;
}
int sz;
CHAR buf[2048];
sz = sizeof(buf);
if(AtlEscapeUrl((LPCSTR)cValue2,(LPSTR)buf,(LPDWORD)&sz,(DWORD)sz) == TRUE)
{
ss.Replace("%%%%", buf);
_variant_t varURL = ss;
_variant_t varEmpty;
m_pWebBrowser->Navigate2(&varURL, &varEmpty, &varEmpty, &varEmpty, &varEmpty);
}
return 0;
}
============================================================================================
and anymore information, or anything you need,
please send me mail or MSN messanger
here's my address
atsuki0714@hotmail.com
thank you all.
Atsuki
|
|
|
|
|
Hello everyone!
I want to make a (purpose-specific) scripting language... Similar to JavaScript, but somewhat simpler. How would I do that? I don't know ASM... How do I make a parser for the language? Something like...
; Check for response<br />
!result = mb "Hello!" $msg ??? ???<br />
<br />
; If OK was pressed,<br />
if !result = MB_PRESS_OK<br />
; Then it's OK.<br />
mb "Bye!" $msg2<br />
endif
I doubt I'll really need math at all, but... Any ideas? Thanks!
Windows Calculator told me I will die at 28.
|
|
|
|
|
There is at least one edit box designed to syntax highlight code here on CP ( I used it years ago to build a Python IDE ), I imagine it would have code that would show some good direction in how to parse a file looking for keywords for code.
Christian Graus - Microsoft MVP - C++
Metal Musings - Rex and my new metal blog
|
|
|
|
|
Can't find it... Does anyone know where it is? Thanks!
Windows Calculator told me I will die at 28.
|
|
|
|
|
For writing a parser you can use flex and bison. Both are freeware tools. As target language it is not necessary to use ASM. You could use any language for that. Since bison fully supports C code, you als can handle the input for teh parser directly to perform you calculations. This is waht an interpreter normally would do.
I hope you have a lot of spare time. Writing compilers is a lot of work
|
|
|
|
|
I am currently using the Typelib wrappers for MSXML that was generated from the MFC Typelib Class wizard. I think I am using the objects incorrectly, and this is generating unhandled exception errors.
I use wizard MFC Class from Typelib to generate wrapper classes for the MSXML5 control (CXMLDOMDocument, CXMLDOMElement, CXMLDOMNode, and CXMLNodeList). The exception occurs when I pass a CXMLDOMNode reference to a function that I want it to work on by stepping down farther in the node tree. For example:
If(m_XMLDOMroot.hasChildNodes())
{
int rootchildcount = RootNodeList.get_length();
for(int i = 0; i < rootchildcount; ++i)
{
CXMLDOMElement childnode = RootNodeList.get_item(i); <- This code sometimes user breaks
SetChildNode(childnode);
}
}
Robert
|
|
|
|
|
Is SetChildNode(...) removing nodes/elements from the NodeList? This causes the length of the NodeList to decrease as your looping which causes 2 errors.
1) If rootchildcount was originally 10, and nodes are being removed, your still comparing against a length of 10, even though there are fewer than 10 nodes in the list.
2) Incrementing i for any iteration where a node was removed from the list, will cause your code to skip over the node (in the nodelist) following the node that was just removed.
|
|
|
|
|