|
This is nowhere near deep enough to generate that message, I suspect something else is wrong with your source.
[edit]Something for the weekend? ... MuraliKrishnaP spotted the obvious point that I missed, which is that you have exceeded the 128 nest limit because of the number of if .. else if statements.[/edit]
It's time for a new signature.
modified on Saturday, August 7, 2010 9:32 AM
|
|
|
|
|
The following code
if(a)
{
}
else if (b)
{
}
else if(c)
{
}
is nothing but
if(a)
{
}
else
{
if (b)
{
}
else
{
if(c)
{
}
}
}
else, you can also do like this. Will this solve your problem?
if(a)
{
if(flag)
{
}
else
{
}
}
if(b)
{
}
if(c)
{
}
|
|
|
|
|
You can turn that into a regular switch, here is the scenario in pseudo-code:
int n=extract the number from string Tree_str;
switch (n) {
case 1:
...
break;
case 2:
...
break;
...
}
it will result in less code and faster execution!
|
|
|
|
|
Shave the levels down to 123 or less.
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"Man who follows car will be exhausted." - Confucius
|
|
|
|
|
|
fail
{
DWORD dwBytes;
int res = WSAIoctl(s,
SIO_GET_EXTENSION_FUNCTION_POINTER,
&GuidConnectEx,
sizeof(GuidConnectEx),
&g_lpfnConnectEx,
sizeof(g_lpfnConnectEx),
&dwBytes,
NULL,
NULL);
int err = WSAGetLastError();
assert(res==0);
}
DWORD bytes_sent;
BOOL ok = (*g_lpfnConnectEx)(s, (sockaddr*)&addr_in, sizeof(addr_in), NULL, 0, &bytes_sent, NULL);
int err = WSAGetLastError();
assert(ok);
succeed
int ok = connect(s, (sockaddr*)&addr_in, sizeof(addr_in));
assert(ok==0);
why?
|
|
|
|
|
The documentation says that when you call ConnectEx, the socket must be already bound.
The connect function binds the socket for you. That must be why connect succeeds when ConnectEx fails.
|
|
|
|
|
tried, still not work
int main()
{
WSADATA wsa;
int res = WSAStartup(MAKEWORD(2,2), &wsa);
assert(res==0);
SOCKADDR_IN addr_in;
addr_in.sin_family = AF_INET;
addr_in.sin_addr.s_addr = inet_addr("127.0.0.1");
addr_in.sin_port = htons(5150);
ZeroMemory(&addr_in.sin_zero, sizeof(addr_in.sin_zero));
SOCKET s = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);
assert(s!=INVALID_SOCKET);
SOCKADDR_IN addr_in_local;
addr_in_local.sin_family = AF_INET;
addr_in_local.sin_addr.s_addr = INADDR_ANY;
addr_in_local.sin_port = 0;
ZeroMemory(&addr_in_local.sin_zero, sizeof(addr_in_local.sin_zero));
res = bind(s, (sockaddr*)&addr_in_local, sizeof(addr_in_local));
assert(res==0);
{
DWORD dwBytes;
int res = WSAIoctl(s,
SIO_GET_EXTENSION_FUNCTION_POINTER,
&GuidConnectEx,
sizeof(GuidConnectEx),
&g_lpfnConnectEx,
sizeof(g_lpfnConnectEx),
&dwBytes,
NULL,
NULL);
int err = WSAGetLastError();
assert(res==0);
}
DWORD bytes_sent;
BOOL ok = (*g_lpfnConnectEx)(s, (sockaddr*)&addr_in, sizeof(addr_in), NULL, 0, &bytes_sent, NULL);
int err = WSAGetLastError();
assert(ok);
for (int i=0; i<10; ++i)
{
char buf[256];
sprintf_s(buf, sizeof(buf), "message %d", i);
WSABUF wsa_buf;
wsa_buf.buf = buf;
wsa_buf.len = strlen(buf);
DWORD bytes_sent;
int res = WSASend(s, &wsa_buf, 1, &bytes_sent, 0, NULL, NULL);
assert(res==0 && bytes_sent==wsa_buf.len);
printf_s("sent: %s\n", buf);
Sleep(1000);
}
WSACleanup();
return 0;
}
|
|
|
|
|
followait wrote: tried, still not work
What does this mean? Please explain which part of the program does not work, what results you receive, what messages you see, what error codes are returned. We cannot guess what happens by looking at your source code.
It's time for a new signature.
|
|
|
|
|
As he suggests, bind the socket used by ConnectEx , but still can't connect successfully.
|
|
|
|
|
followait wrote: but still can't connect successfully.
Did you actually read my previous post? What is the error code returned when your connect call fails?
It's time for a new signature.
|
|
|
|
|
sure, the error code of ConnectEx is 87, it means "The parameter is incorrect.".
|
|
|
|
|
followait wrote: the error code of ConnectEx is 87, it means "The parameter is incorrect.".
OK, so check all your parameters and make sure that they contain values appropriate to the call.
It's time for a new signature.
|
|
|
|
|
I just took a copy of your code and ran it on my Windows 7 system and it runs fine; must be something local to you.
[edit]Actually no it didn't, I had to change a couple of things and misread a fail status. I will test some more tomorrow in the absence of a solution.[/edit]
It's time for a new signature.
modified on Saturday, August 7, 2010 1:05 PM
|
|
|
|
|
Well, I went and did what I should have done in the first place and looked here[^] at the MSDN documentation. Take a look at the final parameter lpOverlapped which must not be NULL, and compare with your code.
It's time for a new signature.
|
|
|
|
|
Fine, it is the reason why it doesn't work.
So ConnectEx works only in asynchronous mode, doesn't it?
Thanks a lot.
|
|
|
|
|
followait wrote: BOOL ok = (*g_lpfnConnectEx)(s, (sockaddr*)&addr_in, sizeof(addr_in), NULL, 0, &bytes_sent, NULL);
Now what would be the most fishy aspect of that statement?
You should realize that for every cast the programmer takes the responsibility away from the compiler; you are simply passing a SOCKADDR_IN thingy and casting it to something else (a sockaddr) in order to make the compiler happy. However if they aren't compatible, that will not work out at run-time. So back to the documentation and the drawing board.
|
|
|
|
|
I want to learn how to write a CD/DVD burning application but I don't have any resources, or where to start. Someone please help me where I can get programming resources and tutorials about this. My preferred language is C, but if C++ no problem, I can still do it.
|
|
|
|
|
|
Hi, dear all,
I have two TextBox in the form which will get data from user input, for each of them I implement Validating event to validate user input.
I expect that after input data and press Enter key, the Validating event will be fired, but not. Even when I click the form, it is not fired also. only if I put cursor to other control in the form, the event is fired, is this normally? how can I force the value be validated when user click Enter key or finishing the typeing?
Thanks
|
|
|
|
|
You're aware that this is the C/C++ forum, right?
|
|
|
|
|
Given an in-between(any node not at the start and end of the linked list) node within a singly linear linked list, how to delete that node, when head pointer of list is not given?
|
|
|
|
|
If head pointer is not given then you dont have a linked list ,
In linked list you always keep the head pointer right ?
|
|
|
|
|
Think what he meant was that you are given the node to delete and not the head of the list that this node is in...which doesn't make sense.
You need the head of a list to delete a node from it because you need to traverse the list find the link before the link to be deleted and then link the previous one with the one after and then free the memory for the link to be deleted...
PREV -> TO BE DELETE -> NEXT
Unless its a circularly linked list the head is needed. If your situation is a circular list then you can just treat the link to be deleted as the head save it and then traverse the list until u reach the one before it in the list and the do the un-linking that way.
|
|
|
|
|
You don't have to delete the node, just zero it maintaining the forward link. The exact value you zero it to depends on the implementation of the list.
As a special case if it's a circular list you can always start iterating and wait until you hit a node with a next pointer of the element that you want to remove.
Incidentally I've noticed from your posts that you're developing an unhealthy fascination with pointers. Start using std::string, std::vector and std::list and a lot of the problems you're having will go away. Pointers and arrays in C++ are really advanced concepts.
Cheers,
Ash
|
|
|
|
|