|
Christian Graus wrote: A stack overflow means generally that a function calls itself until the stack blows. What code is causing it ?
This is the problem, I can't find. Somewhere the stack is being filled thats pretty much obvious, but I am damned if I can find the cause. There are no functions calling themselves, so the only other possible case I can think of is that I am creating a very large array on the stack and not cleaning it after. But looking through my code, the only large array, which is not within the scope of a function, is this vector. But surely this is created in memory rather than on the stack.
|
|
|
|
|
I was looking in totaly the wrong place. The problem lies within WM_NOTIFY
case WM_NOTIFY:
switch(LOWORD(wParam))
{
case IDC_LIST:
if((((LPNMHDR)lParam)->code == NM_DBLCLK)||
(((LPNMLVKEYDOWN)lParam)->wVKey == VK_SPACE)||
(((LPNMLVKEYDOWN)lParam)->wVKey == VK_RIGHT)) {
data->display_student_record();
}
if(((LPNMLVKEYDOWN)lParam)->wVKey == VK_LEFT) {
data->display_view_options(ID_VIEW_CLASS);
}
if(((LPNMHDR)lParam)->code == LVN_ITEMCHANGED) {
}
break;
}
break;
For some reason the LPNMLVKEYDOWN is being triggered, first when drawing more than 32 items, and when scrolling (while holding the up down keys). I can't understand why this is happening. In the above code I check for specific virtual keys, they are being sent even though they have not been pressed. I have also noticed that it makes no difference by returning true or false. Unless they 'real' key is pressed the app just fills the stack. I wonder if this is a bug in the library?
I have had to comment out those lines, which now leaves my app feeling like a brick boat. I am unable to navigate through the list view using they keys :/
|
|
|
|
|
I hope you find a solution, I just wanted to note that WM_NOTIFY is what is being triggered, LPNMLVKEYDOWN is a pointer to the structure. That code should be layed out as if{} if else {} if else{} , or you will be wasting processing time. I do not know if the code LVN_ITEMCHANGED and VK_LEFT (or VK_RIGHT) can occur at the same time, but if they can you will be calling two methods on the same message.
I would probably insert some trace messages into the code to see what is happening. I have also been known to open a file, append a message to it and close the file, each time something occured, that is if it was crashing the whole system.
INTP
Every thing is relative...
|
|
|
|
|
John R. Shaw wrote: code should be layed out as if{} if else {} if else{}, or you will be wasting processing time.
The origional code was set up like that, but due to these overflow problems I had to comment out certain parts in order to locate the problem.
John R. Shaw wrote: I hope you find a solution
I have indeed. The documentation on MSDN is a little misleading, It states that when a key is pressed a LVN_KEYDOWN notification is sent to the parent window, the lParam of which holds a pointer to a NMLVKEYDOWN structure. However the documentation doesn't state that the user should first check for the LVN_KEYDOWN. This was my mistake, I was directly checking the value of the NMLVKEYDOWN.
My code now looks like this
case WM_NOTIFY:
switch(LOWORD(wParam))
{
case IDC_LIST:
if(((LPNMHDR)lParam)->code == NM_DBLCLK) {
data->display_student_record();
}
else if(((LPNMHDR)lParam)->code == LVN_KEYDOWN) {
if(((LPNMLVKEYDOWN)lParam)->wVKey == VK_LEFT) {
data->display_view_options(ID_VIEW_CLASS);
}
else if ((((LPNMLVKEYDOWN)lParam)->wVKey == VK_SPACE)||
(((LPNMLVKEYDOWN)lParam)->wVKey == VK_RIGHT)) {
data->display_student_record();
}
}
else if(((LPNMHDR)lParam)->code == LVN_ITEMCHANGED) {
data->display_extra_data();
}
break;
}
break;
And it is working perfectly, just wish I hadn't changed so much of my code in order in order to find it
|
|
|
|
|
You sound a bit like me ("my mistake"). Yes it was and No it was not, it should have been in the documentation. Yes because you should have realised it, and No because you should not have needed too (it should have been in the docs). This is a reacuring theme in Microsoft documentation, been there.
Example:
The documentation (since Windows 3.1) has always stated that the text output functions support approximately 8192 characters. Why don't they just tell us that it depends on the width of the characters in pixels? In VC6 the limit was still 32767 pixels (I do not know it that has changed) for the entire string, the number of chacaters is not [really] relivant. Yes in a text based world they are, but they should have state why 8192 was an approximation.
Sorry, I get a little carried away. I wrote an code editor a while back and stange things happen when you exceed the pixel limit (position value wrapping [at maximum font point size]).
waldermort wrote: just wish I hadn't changed so much of my code
I understand, that's why I try to remember to drop a copy of my current code in a seperate directory. Otherwise I am liable to forget why I changed it to begin with (notes, notes, notes, ...).
Whoops!
I did it again (carried away).
John R. Shaw
INTP
Every thing is relative...
|
|
|
|
|
Like memcpy(), is there any method for appending the array i,e memcat()....how could i use it???
|
|
|
|
|
There isn't a memcat() function that corresponds to the strcat() function. If you think about it, a 'memcat ' function doesn't make sense. strcat() does string concatenation. A string is a sequence of bytes, terminated by a zero byte. The mem* functions operate on mem ory, which is a sequence of bytes, but not terminated. Instead, the mem*() functions require that you specify a size for the region of memory you are copying.
Given that explanation, memcpy() will do 'memory concatenation' for you:
memcpy(destination + destination_length,source,source_length);
destination_length += source_length; In this case, you are 'concatenating' a source buffer that is source_length bytes long to the end of a destination buffer that is, prior to the concatenation, destination_length bytes long.
Software Zen: delete this;
|
|
|
|
|
How can i append two different arrays?
|
|
|
|
|
You will need to be more specific. We need to know how the arrays where created to begin with. How about a little code, becuase there is more than one way depending on how your created them.
INTP
Every thing is relative...
|
|
|
|
|
Given different files...the code should count the no of words using threading
Nanjesh b.J.
|
|
|
|
|
|
Given different files...the code should count the no of words using threading
Nanjesh
|
|
|
|
|
I am going to implement Dekker's algorithm to
guarantee mutex exclusion between P1 and P2.The
pseudocode are:
<br />
void p1( )<br />
{<br />
flag = 0;<br />
...<br />
"critical section..."<br />
...<br />
}<br />
<br />
void p2( )<br />
{<br />
flag = 1;<br />
...<br />
"critical section..."<br />
...<br />
} <br />
<br />
<br />
void main()<br />
{<br />
parbegin(p1,p2);<br />
...<br />
}<br />
Do you know how to treat(write) pseudocode "parbegin(p1,p2)". I want to simulate a real race condition, p1 and p2 needs to be concurrent.
Can I just express them as:
void main()
{
p1;
p2;
...
}
|
|
|
|
|
Hi,
I'm wondering if I can use the ANSI String Class in normal classes.
I tried yesterday and got an error.
Product.h
#include
#include
using namespace std;
class Product
{
public:
Product(Product&);
Product(string name, int amount , float price);
float GetPrice();
void SetPrice(float price);
void SetAmount(int Amount);
int GetAmount();
void SetName(string name);
string GetName();
Product();
virtual ~Product();
private:
float itsPrice;
int itsAmount;
string itsName;
};
Product.cpp
Product::Product()
{
}
Product::~Product()
{
}
string Product::GetName()
{
return itsName;
}
void Product::SetName(string name)
{
itsName = name;
}
int Product::GetAmount()
{
return itsAmount;
}
void Product::SetAmount(int Amount)
{
itsAmount = Amount;
}
void Product::SetPrice(float price)
{
itsPrice = price;
}
float Product::GetPrice()
{
return itsPrice;
}
Product::Product(string name, int amount, float price)
{
itsName = name;
itsAmount = amount;
itsPrice = price;
}
Product::Product(Product &rhs)
{
itsName = rhs.GetName();
itsPrice = rhs.GetPrice();
itsAmount = rhs.GetAmount();
}
main.cpp
#include "iostream.h"
#include "Product.h"
using namespace std;
int main()
{
Product p1("Apple",0.25,50);
cout << p1.GetName();
int s;
std::cin >> s;
return 0;
}
The error is : error C2679: binary '<<' : no operator defined which takes a right-hand operand of type 'class std::basic_string,class std::allocator >' (or there is no acceptable conversion)
Please help.
Thanks in advance
Tom
-- modified at 8:04 Saturday 4th March, 2006
|
|
|
|
|
Hey Tom: Please repost your question, but this time place your code inside <pre></pre> tags, and click the "Ignore HTML tags in this message" checkbox. It's tough to read your code otherwise. Good luck.
Software Zen: delete this;
|
|
|
|
|
Does gcc or other compiler work?
|
|
|
|
|
derek7 wrote: can I do win32 app without vc?
Sure, there is a version of gcc for Windows: MingW[^]. Also, I would consider an excellent Digital Mars[^] compiler which is also free.
My programming blahblahblah blog. If you ever find anything useful here, please let me know to remove it.
|
|
|
|
|
Hi All,
Wanted to know if theres a way to make the application wait till a blocking call. In My application, before the previous receive() for a message sent is completed, the next message is being sent, any help on how to make the application wait till the response for the previous sent() is received?
Tried having a loop, wherein, the application would send the next message only when IsBlocking() returns a false. But even that doesn't work.
Any help??
|
|
|
|
|
Hi,
I am developing a windows service that uses winsock. However, I am new in service and is wondering on how to implement asynchronous socket in a service.
WSAAsyncSelect uses message pump but service does not have a window class, therefore I tried to create a window but in vain. Anyway, can I really do that?
How do I get the hInstance to create the window? Or please suggest a method to do asynchronous socket in services.
Thanks a lot!
|
|
|
|
|
If you able to deal with the learning curve, there's a more advanced, but much more powerful way to handle async I/O.
It's called I/O Completion Ports. see: http://www.codeproject.com/internet/iocp.asp[^]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br />
Peter Weyzen<br />
Staff Engineer<br />
<A HREF="http://www.soonr.com">SoonR Inc.</A>
|
|
|
|
|
Thanks for the reply Peter Weyzen, I will look into I/O Completion Ports.
However, I come across the WSAEventSelect() in Winsock2. How about that? Is it suitable to use in services? FYI, my services is a client that only deals with one connection.
Thanks again.
|
|
|
|
|
1. what does it work?
2. how to know some predefine variable value .for example $(TargetPath) $(IntDir) etc......
|
|
|
|
|
This is a macro that you use inside a custom build step in a Visual Studio 7.0 or 7.1 project. These macros evaluate to useful folder and file paths that are based on your project's location and name. You can't alter these values, since they are determined for you automatically. You can use environment variables in custom build steps, which may be what you want.
Software Zen: delete this;
|
|
|
|
|
where to find info about these? I know $(OutPath) is value that be set in project attribute.
|
|
|
|
|
In the property pages where you can define the custom build steps. The edit field has a button labelled "...". If you click that, it opens a dialog where you can enter more text in a multi-line edit control. There's a button on that dialog labelled "Macros>>" that displays a list of all of the available macros.
Software Zen: delete this;
|
|
|
|