|
Can anyone explain what is happening here? I am trying to create overloaded relational operators for class member enums. VC6.0 and gcc 3.3.4 compile the code fine. VC7.0 and 7.1 complain that the overloaded operator function is ambiguous. The following code illustrates the problem:
class A
{
public:
enum level
{
none, low, medium, high
};
};
bool operator>( A::level l1, A::level l2 )
{
bool greater = false;
switch( l1 )
{
case A::low:
switch( l2 )
{
case A::none: greater = true; break;
}
break;
case A::medium:
switch( l2 )
{
case A::low:
case A::none: greater = true; break;
}
break;
case A::high:
switch( l2 )
{
case A::medium:
case A::low:
case A::none: greater = true; break;
}
break;
}
return greater;
}
int
main( int argc, char * argv[] )
{
A::level l1 = A::high;
A::level l2 = A::low;
if( l1 < l2 )
{
return 1;
}
if( l1 > l2 )
{
return -1;
}
return 0;
}
VC6.0 and gcc compile cleanly. VC7.0 and 7.1 fail with the following error:
Compiling...
enumtest.cpp
d:\misc\test.cpp(54) : error C2593: 'operator >' is ambiguous
d:\misc\test.cpp(13): could be 'bool operator >(A::level,A::level)'
or 'built-in C++ operator>(A::level, A::level)'
while trying to match the argument list '(A::level, A::level)'
What are the built-in operators mentioned? Is the compiler assuming that an enum-is-an-enum-is-an enum, and thus bypasses the strong typing? What is the correct way to write this that conforms to the standard and is portable?
Any and all insights will be welcome.
|
|
|
|
|
struct employee
{
int emp_id;
char name[20];
};
void main()
{
struct employee *A;
struct employee **B;
B = &A;
//how do i access the emp_id and name field of **B
}
how can i change the emp_id and the name field of **B? th complier allowes me to write A->name = "whatever"; but it doesnt allow me to write b->name = "whatever";.
|
|
|
|
|
try
(*B)->emp_id = 0;
C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, it blows away your whole leg
|
|
|
|
|
Mridang Agarwal wrote:
how can i change the emp_id and the name field...
In your example, you cannot. Doing so would yield an access violation because an instance of the employee structure does not exist.
"Ideas are a dime a dozen. People who put them into action are priceless." - Unknown
|
|
|
|
|
I have used part of this code from a tutorial I found on this website and I am now trying to adapt it into being useful for my program to use the data it recieves. I am probably doing totally the wrong thing as some of it I don't really understand yet as I am fairly new to c++. I know the data that is being recieved is "START" as it echos the data into the console so that I can see it. However when I come to the if statements it is not proccessing the data and echoing back the statements I want it to. The code is below for the part of the program which proccesses the data. I know the rest of the program works it is just using the data in the if statments. If you need any more information please just ask and I will try to provide it to you as best as I cant. Thanks in advance to anyone that helps.
UINT ClientThread(LPVOID pParam)
{
char buff[512];
CString cmd;
CString params;
int n;
BOOL auth=false;
SOCKET client=(SOCKET)pParam;
strcpy(buff,"#Server Ready.\r\n");
send(client,buff,strlen(buff),0);
while(true)
{
n=recv(client,buff,512,0);
if(n==SOCKET_ERROR )
break;
buff[n]=0;
std::cout << "Data: " << buff;
if(buff=="QUIT")
{
std::cout << "QUIT Command Recieved\r\n";
break;
}
if(buff=="START")
{
cout << "Start Command Recieved\r\n";
}
closesocket(client);
return 0;
}
}
|
|
|
|
|
You can't compare strings like that. Use the strcmp() method.
Ryan "Punctuality is only a virtue for those who aren't smart enough to think of good excuses for being late" John Nichol "Point Of Impact"
|
|
|
|
|
Ok thanks,
I will try looking at that.
|
|
|
|
|
I have done a little search on google for the command and come up with a few things but would you mind showing me how I could actually use it in my situation. As far as I understand it only compares whether a string is greater or less than the other one or am I wrong?
|
|
|
|
|
nvm I managed to figure it out.
|
|
|
|
|
Hi
I am relatively new to Minidumps & WinDbg. I work on a GUI application developed on VS.Net 2003 (unmanaged code) where I have added a handler for Unhandled Exceptions using SetUnhandledExcpetionFilter. The handler function creates Minidumps. (this code was found in codeproject: http://www.codeproject.com/debug/postmortemdebug_standalone1.asp)
For testing purposes, I made the app crash due to Null ptr reference in one of the screens. The problem is that when I open the dump file in WinDbg, it does not show complete stack trace.
I use WinDbg as the default debugger; So it was interesting to see that when I remove the unhandled exception handler and let the app crash, WinDbg takes over and at that time, it shows
complete stack trace for the same code. So I don't understand what I am missing when creating / viewing the minidump.
Can anyone please help? I highly appreciate any help/ideas from your side.
Thanks
Jay
|
|
|
|
|
|
Hi,
I'm using Chris MFC GridCtrl in my app in a dll.
My App is working fine in debug mode.
But as soon as I call the diolog (inside dll) - which is using the grid control - in release mode, my app crashes?
Has anyone had made the same experience, or has an idea, or even better a fix for that problem?
I've no idea how to fix this! Pressing the Retry-Button of the Assertion Dialog stops at:
-----------------------------------------------------
AFXWIN1.INL:
_AFXWIN_INLINE HINSTANCE AFXAPI AfxGetInstanceHandle()
{ ASSERT(afxCurrentInstanceHandle != NULL);
return afxCurrentInstanceHandle; }
-----------------------------------------------------
Thanks Ralph
[Reply][Email][View Thread][Get Link] [Modify|Delete]
|
|
|
|
|
So are you showing a dialog from inside the DLL? If so, have you used the AFX_MANAGE_STATE macro at the top of the method that uses the dialog?
Or if you are using a dialog that is stored inside the DLL from your EXE, have you called AfxSetResourceHandle() to tell MFC where to find the dialog template?
Ryan "Punctuality is only a virtue for those who aren't smart enough to think of good excuses for being late" John Nichol "Point Of Impact"
|
|
|
|
|
Thanks for your reply!
I've already used the AFX_MANAGE_STATE macro before.
Now I've inserted the AfxSetResourceHandle() call, but the Assertion appeared in the same way.
I'm not sure, but I guess the resource handling should not differ between debug and release mode, or I'm wrong?
Regards Ralph
|
|
|
|
|
|
as the name says, it is when you lose some memory segments.
actually, it is when the memory is not well managed by a program, and is not entierly restituted to the system as "free" when the program leaves... this way, it cannot be re-used by another process...
TOXCCT >>> GEII power [toxcct][VisualCalc]
|
|
|
|
|
OK, I have an error in my application and somehow seem to corrupt the stack.
I have done a search on Google for a market overview. And what really really bothers me is that it seems that all vendors stopped developing their tools years ago. No new functions, no update, no nothing
I found:
- Purify
- Insure++
- BoundsChecker
- and some others.
Question:
Can you recommend me an actively supported and developed tool for checking all kind of programming errors like memory leaks, cross-threading issues, pointer issues, stack issues and so on?
--
Affordable Windows-based CMS for only 99 €: try www.zeta-producer.com for free!
|
|
|
|
|
At work we use purify, and it works quite good and is a pretty fast solution for finding memory related problems.
I tried boundschecker and its also pretty good, it integrate several error checking capabilities like the thing you mentioned, and more (deadlock detection, call validation, object tracking, .NET analysis ...)
Papa
while (TRUE)
Papa.WillLove ( Bebe ) ;
|
|
|
|
|
Thank you, I will try purify! Is it still being activly developed with new versions?
--
Affordable Windows-based CMS for only 99 €: try www.zeta-producer.com for free!
|
|
|
|
|
I know that they are currently working on new features in Purify plus
Papa
while (TRUE)
Papa.WillLove ( Bebe ) ;
|
|
|
|
|
Do you have any detailed information? Like e.g. release date or supported platforms/IDEs (like VS.NET 2005 e.g.) or new features?
--
Affordable Windows-based CMS for only 99 €: try www.zeta-producer.com for free!
|
|
|
|
|
Are you saying that BoundsChecker v7.1 is out-of-date?
"Ideas are a dime a dozen. People who put them into action are priceless." - Unknown
|
|
|
|
|
I do have 7.02 (or something like that) from 2002 and therefore I imply that 7.1 is out of date, too. Additionaly the sales man told me to contact me when new releases are available but I never heard from him again
--
Affordable Windows-based CMS for only 99 €: try www.zeta-producer.com for free!
|
|
|
|
|
|
I tried the following lines of code on VC++ 2003.NET:
wofstream file;
wstring filename = "whatever.xml"
file.open(filename.c_str(), ios_base::out | ios_base::trunc);
however when compiling I get an error saying that the compiler can't convert from const wchar_t* into const char*. What happened to polymorphism. When I look at the error message I can see that the file variable is correctly a basic_stream using wchar_t but the open function still wants to take a const char*. Isn't this wrong? Is this an incorrect implementation?
I am the handsome one in the crowd.
|
|
|
|