|
Thank You Hamiod & David
-- modified at 22:30 Wednesday 24th October, 2007
|
|
|
|
|
Hi All,
I am using VC++ MFC Application.
I want to know the typeof my variable at run time, how can I do that? I hope it is possible with the typeof operator, but it gives me error like this identifier not found.So, is it possible with VC++ to use something like typeof operator??
Thanks in Advance.
Ashish Bhatt
|
|
|
|
|
Try to see 'CRuntimeClass' in the MSDN Library. Good luck
|
|
|
|
|
ashishbhatt wrote: I hope it is possible with the typeof operator
Where is that function? Or did u mean typeid() ?
|
|
|
|
|
|
The following represents standard C++ code, no Microsoft specifics involved.
void add_c_set(nfa_type& nfa, const string_set_type& c_set, bool and_flag) const;
void add_id_set(nfa_type& nfa, const ccid_set_type& id_set, bool and_flag) const;
The above problem occured, in long standing code, when I seperated some unrelated methods from a seperate template class, as they could stand on their own. Although I considered it a seperate issue, this must be related, the "Visual C++ 6.0" compiler started complaining about heap space (for symbols) when compiling for Unicode (not for ASCII). When compiling with "Visual C++ .Net" there are no problems.
The "string_set_type" is an STL set of STL strings (char or wchar_t) and "ccid_set_type" is a set of special identifiers. A "ccid" is basically a type derived from a template class that wraps an "unsigned char" value.
If you have any ideas, or have seen this problem before, please throw it out there, as I need a clue.
Thanks.
INTP
"Program testing can be used to show the presence of bugs, but never to show their absence."Edsger Dijkstra
|
|
|
|
|
John R. Shaw wrote: string_set_type
John R. Shaw wrote: ccid_set_type
I think this use of macros is dumb and makes code unreadable. Can you provide the actual macros so we can see what we're dealing with ?
Christian Graus - Microsoft MVP - C++
"also I don't think "TranslateOneToTwoBillionOneHundredAndFortySevenMillionFourHundredAndEightyThreeThousandSixHundredAndFortySeven()" is a very good choice for a function name" - SpacixOne ( offering help to someone who really needed it )
|
|
|
|
|
Christian Graus wrote: Can you provide the actual macros...
Christian,
Why would you think I was using macros? That would be counter productive and bad practice in C++. The code is pure standard C++, and applies nothing but the best practices. Using “typedef” is common practice, as examining any STL container will show.
typedef std::set<string_type> string_set_type;
typedef std::set<ccid_type> ccid_set_type;
The template takes the same arguments as “basic_string” and “string_type is defined as:
typedef std::basic_string<_CharT_, _Traits_, _Alloc_> string_type;
I am using a C++ STL style of coding, because this code is intended to be familiar to anyone use to using the STL.
The code has been working for months, but it needed some minor improvements. The “add_set” methods worked perfectly until yesterday, when I separated those other methods from a separate template class that has nothing to do with this one.
INTP
"Program testing can be used to show the presence of bugs, but never to show their absence."Edsger Dijkstra
|
|
|
|
|
Looks like the compiler cant tell the differnce between string_set_type and ccid_set_type.
Is it possible that when this code is compiled the compiler only has a forward declaration of one or both of these?
ie...
class ccid_set_type;
class string_set_type;
class Foo
{
void Add(const ccid_set_type&);
void Add(const string_set_type&);
};
|
|
|
|
|
I don't think they are classes, I think they are #defines for stl containers.
Christian Graus - Microsoft MVP - C++
"also I don't think "TranslateOneToTwoBillionOneHundredAndFortySevenMillionFourHundredAndEightyThreeThousandSixHundredAndFortySeven()" is a very good choice for a function name" - SpacixOne ( offering help to someone who really needed it )
|
|
|
|
|
Josh Gray wrote: Is it possible that when this code is compiled the compiler only has a forward declaration of one or both of these?
No, everything is declared where it is supposed to be. Until yesterday it compiled perfectly with both methods named “add_set”, as it has for months. As a matter of fact I had not touched this template until this unexplained phenomenon occurred.
It has to have something to do with making those other methods, I mentioned, stand alone, as that is when it started happening. It only happens with VC 6.0, as VC .NET has absolutely no problems with it, even at warning level 4.
Why it can not tell the difference between two types that have totally different signatures is very confusing. It has to be related to the compilers heap space, but it never gets this far if that error occurs.
error C2535: '…' : member function already defined or declared
INTP
"Program testing can be used to show the presence of bugs, but never to show their absence."Edsger Dijkstra
|
|
|
|
|
This is a long shot but you could try using the typename keyword
void add_c_set(nfa_type& nfa, const typename string_set_type& c_set, bool and_flag) const;
void add_id_set(nfa_type& nfa, const typename ccid_set_type& id_set, bool and_flag) const;
|
|
|
|
|
It was a long shot, but I tried it anyway. It had no effect, as expected.
I am getting offline now, but tomorrow I am going to reverse the changes I made yesterday and proceed with the changes one step at a time using the VC 6 environment instead of VC .NET, so I can see precisely when the error first appears.
Thanks for trying.
INTP
"Program testing can be used to show the presence of bugs, but never to show their absence."Edsger Dijkstra
|
|
|
|
|
If you know anything at all about either of these two functions, it's that SuspendThread[^] can be dangerous (primarily because it creates application deadlocks if not properly used). Read, Jochen Kalmbach's WebLog [^]
However, if you want to use the StackWalk64[^]function from the dbghelp.dll, you must call SuspendThread to get relavant and useful results.
So, what is the PROPER way to use SuspendThread? How could you possibly know of all the mechanisms and objects that are currently activated by a thread?
|
|
|
|
|
Baltoro wrote: However, if you want to use the StackWalk64[^]function from the dbghelp.dll, you must call SuspendThread to get relavant and useful results.
Only if you want to walk the stack of a thread other than the current one.
This is fairly obvious, if you didn't suspend the other thread it's stack would likely change while you are walking it.
The only problem in suspending another thread is that, as mentioned, any other threads waiting on the the suspended thread are going to keep waiting. This isn't a problem unless their waits time-out, even this isn't a problem because it tests your codes response to a rare error condition.
...cmk
The idea that I can be presented with a problem, set out to logically solve it with the tools at hand, and wind up with a program that could not be legally used because someone else followed the same logical steps some years ago and filed for a patent on it is horrifying.
- John Carmack
|
|
|
|
|
...thanks, ...cmk
I was referring to a remote thread, even though it was unstated.
I asked this question over on the Microsoft Technical Forums and got approximately the same answer.
It isn't really a problem, I was just curious.
|
|
|
|
|
using a socket I'm connecting to an irc server, when i do i get:
NOTICE AUTH :*** Processing connection to efnet.demon.co.uk
NOTICE AUTH :*** Looking up your hostname...
NOTICE AUTH :*** Checking Ident
NOTICE AUTH :*** Found your hostname
NOTICE AUTH :*** Got Ident response
this is all i get no welcome message, no matter what i send through this socket i don't get any response.
then after a while i get:
ERROR :Closing Link: 127.0.0.1 (Connection timed out)
thanks
|
|
|
|
|
What do you mean, you "get" that from the server? How are you receiving that text?
Are you sending the appropriate messages to connect to the server, as per the IRC protocol?
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
What do you mean, you "get" that from the server? How are you receiving that text?
yes that is what i get from the server when i connect, via recv (s, buffer,bufferSize, 0);
Are you sending the appropriate messages to connect to the server, as per the IRC protocol?
not sure, according to this all you have to do is send commands like NICK name etc, once you are connected, but it doesn't seem to be working.
http://www.irchelp.org/irchelp/rfc/rfc.html
|
|
|
|
|
It's impossible to say without seeing any code, but things to look at are:
1) Parsing messages from the server - the protocol doesn't include message length
parameters so it's up to you to recv() all bytes whenever there's an FD_READ event
and parse the bytes into messages. Remember, on one recv(), you may only get a partial message.
You have to deal with that.
2) Make sure you're forming your client-to-server messages correctly. ASCII only - no Unicode.
Use proper whitespace. Check for server replies.
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
connect function experimenting with:
int Client::Connect(HWND hwnd)<br />
{<br />
char message[200];<br />
cUser user;
sprintf(user.nick,"myNic");<br />
sprintf(user.ident,"IDspoonMan");<br />
sprintf(user.email,"vertexar@yahoo.com");<br />
sprintf(message,"USER %s %s: %s %s \n\r", user.nick , user.email , user.ident , user.ident );<br />
<br />
Port = 6667;<br />
WSAStartup(MAKEWORD(1,1), &wsaData);<br />
LPHOSTENT hostEntry;<br />
hostEntry = gethostbyname("efnet.demon.co.uk");<br />
if(!hostEntry)<br />
{<br />
::MessageBox(NULL,"Failed gethostbyname()","Error",0);<br />
}<br />
<br />
s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);<br />
ServerAddr.sin_family = AF_INET;<br />
ServerAddr.sin_port = htons(Port); <br />
<br />
ServerAddr.sin_addr = *((LPIN_ADDR)*hostEntry->h_addr_list);<br />
<br />
if (WSAAsyncSelect(s, hwnd, customClientMessage,FD_READ | FD_WRITE | FD_CONNECT | FD_CLOSE) == SOCKET_ERROR) <br />
{<br />
::MessageBox(NULL,"TSWCCould not set to non-blocking! ", "ERROR..", MB_OK);<br />
return false;<br />
}<br />
int CON_ERROR = connect(s, (SOCKADDR *) &ServerAddr, sizeof(ServerAddr));<br />
Sleep(10);<br />
send(s,"NICK mynic \n\r",15,0);<br />
send(s,"USER mynic 0 * myname \n\r",27,0);<br />
int errorCode = WSAGetLastError();<br />
if(!CON_ERROR)<br />
return true;<br />
return false;<br />
}
using telnet i tried this and it works:
o efnet.demon.co.uk 6667
NICK mynic
USER mynic 0 * myname
i dont see why is not working when i send it through my socket.
|
|
|
|
|
You're not using asynchronous sockets correctly.
You should be checking if connect() is successful. If it's not, you need
to check the error code - if it's WSAEWOULDBLOCK, then you need to wait until the
socket is connected before writing data to it. You'll know this when you get the
FD_CONNECT notification, at which time you need to check for errors again, to make sure
the connection succeeded. THEN you can write data to the socket.
"Sleep(10)" is really bad design. It could take hundreds or thousands of milliseconds to
connect.
Maybe you'll get lucky and connect() will succeed instantly (unlikely when connecting to a
WAN address) - you don't check for that though.
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Lamefif wrote: using telnet i tried this and it works:
o efnet.demon.co.uk 6667
NICK mynic
USER mynic 0 * myname
i dont see why is not working when i send it through my socket.
My suggestion, either stick with a blocking socket so you can connect+send+evaluate... or use an non-blocking socket (something like CAsyncSocket). In the later case you would register an event handler for OnConnect(): socket got connected and you can send login information, plus an event handler for OnReceive(): more data has been received. It probably helps to have a look at example code.
/M
|
|
|
|
|
How do I communicate between two windows forms in the same application? I have a main form that uses "showDialog()" to create the second form in which i type some information. Upon clicking on the "Ok" button of the second form, i need to pass the information i typed to the main form.
I'm new to Managed C++ and a bit noob which C++, so, please, be patient...
I've tried to put a "System::Windows::Forms::Form^ form" as an argument in the constructor of the second form and then, when it was initialized in the main form, I used a "this" to pass the argument.. but it didn't work.
Code in the 2nd form:
SecondForm(System::Windows::Forms::Form^ form) {
}
Code in the 1st form:
SecondForm form2 = gcnew SecondForm(this)
form2->showDialog();
(i intended to pass information by using something like form->function(args)).
I've read something about using delegates, but the article was oriented for c#..
Can anyone help me, plz? Thanks
|
|
|
|
|
|