|
The following code gives me a compile error C2440
'=' : cannot convert from 'void (__cdecl MyClass::*)(void)' to 'void (__cdecl *)(void)'
Header:
class MyClass
{
MyClass();
typedef void FOO();
FOO Show;
FOO *pfun[2];
}
Source:
MyClass::MyClass()
{
pfun[0] = Show;
}
In the error message, the only difference between the two types is the scope resolution operator.
|
|
|
|
|
Member function pointers are a bit tricky.
The class declaration should look like this:
class CMyClass
{
public:
void Assign()
{
m_FuncArray[0] = Fn1;
m_FuncArray[1] = Fn2;
m_FuncArray[2] = Fn3;
}
void Use()
{
(this->*(m_FuncArray[0]))();
}
protected:
typedef void (CMyClass::*MyFuncPtr_t)();
MyFuncPtr_t m_FuncArray[3];
void Fn1() { TRACE( "CMyClass::Fn1 called.\n" ); }
void Fn2() { TRACE( "CMyClass::Fn2 called.\n" ); }
void Fn3() { TRACE( "CMyClass::Fn3 called.\n" ); }
};
It's supposed to be hard, otherwise anybody could do it!
|
|
|
|
|
Wow, this looks really promising. I am sorry I did not see your post until now. I have an out of town job commitment that will not permit me to try this out until Friday. Thank you, Roger. I can hardly wait to try it.
|
|
|
|
|
CastleIsle wrote: void show1();
void show2();
void show3();
void (*pfun[3])() = { show1, show2, show3 };
There is nothing wrong with your declaration, but using a typedef for the function pointer type would make things more clear, e.g.
typedef (*MyFunctionPointer_t)();
MyFunctionPointer_t MyFunctionPointerArray[3] = { show1, show2, show3 };
There is no difference between a console app and an MFC app, it's still C/C++ synthax.
Hope this helps
--
Roger
It's supposed to be hard, otherwise anybody could do it!
|
|
|
|
|
Thank you everyone for your suggestions. This is still unresolved.
MFC app compiler should have the same c/c++ rules as the console app compiler, but it doesn't. Here is another example:
int TestArray[] = {3,4,5}; // MFC will only accept this within
// a function. MFC rejects this
// statement in a header file.
// Console compiles the line
// in either location.
|
|
|
|
|
CastleIsle wrote: MFC app compiler should have the same c/c++ rules as the console app compiler, but it doesn't.
Oh, yes it does.
This is not dependant on whether you are building a console app or an MFC app.
Since you are DEFINING the variable in a header file you will get errors if that header file is included in more than one source file. The linker will complain about multiple definitions.
You can have as many DECLARATIONS as you want, but you can only DEFINE a variable in one place.
Probably in your console project you have only one definition since the header file is included in one source file only, but several in your MFC app since the AppWiz includes each header file in more than one source file by default.
Tip of the day: never define variables in header files.;)
If you write your statement at the top of one single source file then the variable will be defined only once. Declare it as extern in the header file to be able to access in from other source files.
If this doesn't clear things up for you, post again and describe how and where you declare your variable and why.
--
Roger
It's supposed to be hard, otherwise anybody could do it!
|
|
|
|
|
All my header files have the standard
#if !defined(gobbledygook)
#define gobbledygook
// definitions here
#endif
... supplied by Visual C++ wizardry to prevent double definitions. Anyway, I have also tried defining the function pointer array in the source file and the MFC compiler still objects to initialization. I wish you were right.
|
|
|
|
|
CastleIsle wrote: #if !defined(gobbledygook)
#define gobbledygook
// definitions here
#endif
When the next source file in the build process is built, the definition above is undefined. If you declare a class and plan to use it in more than one file, you have to include the header file with the class declaration in every file that uses the class in question, otherwise the class will be undefined.
Each source file is compiled separately and for each source file an object file (.obj) will be generated. The linker will link the object files together and build the executable. There is no mysterious way for the compiler to guess what was declared/defined when the last file was compiled.
(Sorry, but I consider this basic C/C++ knowledge...)
CastleIsle wrote: I have also tried defining the function pointer array in the source file and the MFC compiler still objects to initialization.
Yep, but that's because you're doing it wrong. See my previous post on your reply to Cedric about how to deal with arrays of function pointers to member functions.
CastleIsle wrote: I wish you were right.
I am right.
--
Roger
It's supposed to be hard, otherwise anybody could do it!
|
|
|
|
|
i'm using this code snippet to create a temp file name :
<br />
CString CUtil::CreateTempFileName( void ) <br />
{<br />
CString cs = "";<br />
TCHAR szTempName[_MAX_PATH];<br />
TCHAR szPath[_MAX_PATH];<br />
if(GetTempPath(sizeof(szPath), szPath) != 0)<br />
{<br />
if(GetTempFileName(szPath, _T("csc"), 0, szTempName) != 0)<br />
{<br />
cs = szTempName;<br />
}<br />
}<br />
return( cs );<br />
}<br />
Its results in something like :
c:\DOKUME~1\USERKE~1\LOKALE~1\Temp\csc14.tmp
Anybody with an idea how to get the (real) long file name instead of this old 8.3 notation ?
Thank's for any hint !
|
|
|
|
|
Have a look at the GetLongPathName function.
Steve
|
|
|
|
|
Is working ... thank's a lot
|
|
|
|
|
Dear All
I have tried to enter Arabic/Urdu strings in a Visual C++ project, in the VS IDE they look just find, but when I compile and run the application they just show up as ? marks like ????.
Any Ideas?
- A programmer's national anthem; "AAAAAHHHHH!!!!"
|
|
|
|
|
You need to build your application Unicode aware for displaying such characters you told.
Regards,
Rajesh R. Subramanian
You have an apple and me too. We exchange those and We have an apple each.
You have an idea and me too. We exchange those and We have two ideas each.
|
|
|
|
|
Try for UNICODE compatible functins in your project. make use of _T() like functions rather that normal ASCII Functions.
-Malli...!
|
|
|
|
|
In the project settings, I have specified "Unicode Character Set".
and I only entered a menu option in Urdu, it was displaying it alright inside the IDE, but when I ran it, they were showing as ????. Do I need to used _T() for Menu Resource, if yes, where do I do that?
- A programmer's national anthem; "AAAAAHHHHH!!!!"
|
|
|
|
|
See the following link and unires sample. Basically you need to save the file in Unicode and comment out the #pragma codepage directive. You will not be able to edit the file with Visual Studio's resource editor. You need to edit it with a Unicode enabled source editor.
|
|
|
|
|
hello....
i have to read a file that has hex values.....i read them as string initially,i would want to know if there is already a function to convert this string(of hex) directly to int?....like we have for converting string(of int) to integer using atoi() fnction....?
|
|
|
|
|
sscanf() using the %x format specifier.
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"
|
|
|
|
|
thank u ryan and stephen!.....
|
|
|
|
|
Here's one way to do it:
------------------------
#include <iostream>
#include <sstream>
using namespace std;
int main(int argc, char* argv[])
{
const char* Number = "baadf00d beeff00d";
istringstream ss;
ss.str(Number);
unsigned int num;
while ( ss >> hex >> num )
{
// Converted...Output the number in decimal.
cout << num << endl;
}
return 0;
}
Steve
|
|
|
|
|
You can use *scanf -type functions, but functions specifically designed to do convert strings to numeric values already exist and will likely perform better than the *scanf -type functions. You do not need to use a shotgun to kill a fly...
Look up the strtol /wcstol , strtoul /wcstoul , and StrToIntEx functions.
The StrToIntEx function handles leading whitespace, and sign indicator (ignored), and a leading 0x hex. specifier. Much more robust parsing than you get doing something simple like using "%x" with a *scanf -type function.
Peace!
-=- James If you think it costs a lot to do it right, just wait until you find out how much it costs to do it wrong! Avoid driving a vehicle taller than you and remember that Professional Driver on Closed Course does not mean your Dumb Ass on a Public Road! DeleteFXPFiles & CheckFavorites (Please rate this post!)
|
|
|
|
|
hi,
I am trying to draw a owner draw check box. I want to draw a focus rect around my control. But i don't know when to draw the focus rect. In a normal check box the foucs rect is not drawn when the focus is set through the mouse. But if we set the focus through the keyboard, the focus rect is draw.So my question is is there any way to know how the foucs came to a control( via keyboard or mouse )?
Thanks in advance
nav
|
|
|
|
|
Hi Nav,
Naveen raj mohan wrote: So my question is is there any way to know how the foucs came to a control( via keyboard or mouse )?
You can find out what had the focus before you get it, but you can't find out if it came from the mouse or the keyboard; in general, you don't need to know how it got there, you just care about the fact it did.
To find out what had it before, handle WM_SETFOCUS, and take a look at the wParam - that's the HWND of what had the focus before (note that it can be NULL). If you're using MFC, handle OnSetFocus(CWnd *pwnd) - the pwnd is what had the focus before.
Naveen raj mohan wrote: I want to draw a focus rect around my control.
Try the DrawFocusRect API (or CDC::DrawFocusRect if you're using MFC).
- Dy
|
|
|
|
|
A control draws the foucs rect if it have.
consider the case i have added a check box with tab stop style. By default windows behaviour, when i click on the the check box it dosen't draw a focus rect. But if i press the tab once and the click on the check box, it will draw the foucs.
In my case i am useing an owner draw chak box. So i don't want to draw a frame rect when ever i have focus but only when the focus comes to check box after the the user have pressed the tab key.
Isn't this correct method
Thanks
nave
|
|
|
|
|
Take a look at ODS_FOCUS and ODA_FOCUS . Carefully go through the documentation on them.
Nibu thomas
Software Developer
|
|
|
|