|
Hello,
Mine is a project in Visual C++, in which I am using STL, and trying to use the "find" algorithm with vectors. But it's giving me the error, error C2678: binary '==' : no operator found which takes a left-hand operand of type 'xyz' (or there is no acceptable conversion), because I have an app class in MFC which has a structure 'xyz' whose only member is a BYTE array. I am trying to get the iterator position by finding a value in a vector of a user-defined type and in return I am getting the above error. Hence a problem. Please help.
OR
someone can also suggest, which algorithm should I use to get the iterator position of the value I am searching for,from a vector of a user-defined data type (you can suggest that algorithm from the boost library also)?
Please help.
Thanks in advance. This is urgent.
Here is the relevant code snippet to understand the problem:
In the header,
typedef struct xyz
{
BYTE byHex[16];
}XYZ;
class CMyApp : public CWinApp
{
-----
------
public:
vector<XYZ> m_vec;
-------
--------
DECLARE_MESSAGE_MAP()
};
And in the implementation, in .cpp,
BYTE byBuff[16] = {0};
vector<XYZ> ::iterator viter;
viter = find(theApp.m_vec.begin(), theApp.m_vec.end(), byBuff);
And, here this "find" algorithm is giving me problems.
-- modified 26-Feb-16 7:29am.
|
|
|
|
|
Implement the equal (==) operator for your xyz class and the type on the right side.
To get more help you should show us the relevant code (the operation, the structure, and the right side type). To do this edit your initial question to add this information.
|
|
|
|
|
As already suggested implement the equal operator. This requires changing the typedef struct to a struct (in fact a class):
struct xyz
{
BYTE byHex[16];
bool operator==(const xyz& other)
{
return 0 == memcmp(other.byHex, this->byHex, sizeof(this->byHex));
}
bool operator==(const BYTE buf[16])
{
return 0 == memcmp(buf, this->byHex, sizeof(this->byHex));
}
};
Then use it as before:
BYTE byBuff[16] = {0};
vector<xyz> m_vec;
vector<xyz> ::iterator viter;
viter = std::find(m_vec.begin(), m_vec.end(), byBuff);
|
|
|
|
|
Many thanks for this solution, I fully appreciate it. Coincidentally, I had already implemented this, but since this was taking time in checking a database which is huge in size, I was looking for some other algorithm which will give a quicker result. Could you please suggest a better algorithm which will save me from using memcmp?
-- modified 26-Feb-16 8:46am.
|
|
|
|
|
Quote: Could you please suggest a better algorithm which will save me from using memcmp? Here it is:
struct xyz
{
BYTE byHex[16];
bool operator==(const xyz& other) const { return other.byHex == this->byHex; }
bool operator==(const BYTE buf[16]) const { return buf == this->byHex; }
};
But this won't be faster because the compiler will usually generate code that calls memcmp internally (or in most cases uses an inline version of memcmp ).
NOTE:
In my initial answer I forgot to make the functions const .
|
|
|
|
|
Hi Jochen,
First of all, many thanks for your solution. Although it has solved my operator == overloading question, but I have one more difficulty, may be a strange experience. The find algorithm of STL is not giving the iterator position, even if the item to be searched is located in the BYTE array. Does it have anything to do with the size of the arrays as well? because one BYTE array is of 16 bytes, and the one it is to be compared with is of 33 bytes? In such a case, how can I make the find algorithm give me the correct answer? Please help.
Thanks in advance.
- Sanjay
|
|
|
|
|
std::find is a function to search for an identical value of a specific type. If you have different types it won't work. This includes arrays of same type but different length.
What you are probably looking for is some kind of 'contains' (like strstr ) or 'begins with' (like memcmp and strncmp with length of searching value) function which you have to implement yourself.
Example:
for (int i = 0; i < m_vec.size(); i++)
{
if (MySearch(m_vec.at(i), searchValue))
{
break;
}
}
|
|
|
|
|
Visual Studio 2012, C++
I have several utilities to be put in a DLL.
If the utilities put in a DLL are built without MFC and without ATL, can they be used by those types of projects?
Can the products of multiple projects, within a single solution, be put into a single DLL? So far, my limited experience indicates this is not the case.
Can Visual Studio show the contents of a DLL? I don’t want a reverse compiler/assembler, I just want to see the signatures of the functions contained by the DLL.
My apologies for the double post. The first one disappeared and I thought I had messed up so posted again.
Thank you for your time
If you work with telemetry, please check this bulletin board: www.irigbb.com
modified 25-Feb-16 19:12pm.
|
|
|
|
|
You can put any code into a DLL. It is even simpler and better when the DLL code did not use MFC or ATL (it can then be used by any application).
I'm not sure if I understand your second question. Do you mean to create a DLL with functions used by multiple applications where each application uses only a subset of exported functions?
If so, the answer is yes.
To list the symbols exported by a DLL you can use the DUMPBIN[^] command line tool (located in the VC\bin directory) with the /EXPORTS option.
You can also use the GUI tool Dependency Walker (depends.exe)[^].
Both will list the names of exported functions and variables. The Dependency Walker can also show the parameters when present in the DLL (has been build with C++ decoration).
|
|
|
|
|
Already answered in the ATL forum.
|
|
|
|
|
hi
i want to control parts of my code with #ifdef directive,so I need to control a #define directive before!
something like this:
if (condition)
#define active
and in other files I will check whether "active" is defined or not!
ok,I can put :
#define active
in header file then use it in others cpp files
but I cant use if statement in header!
how can i do that?
cheers,
peiman
|
|
|
|
|
Please explain your problem using an example. It is (at least for me) unclear.
Common practice is to define a value somewhere (inside a header file or even passing it to the compiler via command line; optionally by project settings).
So assuming you use ACTIVE as boolean condition (defined or not defined):
#define ACTIVE
#ifdef ACTION
#endif
#ifndef ACTION
#endif
But this won't work if there is a code condition like
if (condition)
Then you have to use similar code conditions in all other places.
Note also that I have used all upper case for the defined value because this is common practice.
To know about conditional inclusions using the preprocessor see Preprocessor directives - C++ Tutorials[^].
|
|
|
|
|
p3im4n wrote: but I cant use if statement in header! Why not? A header is just a text file that gets included into, and compiled as part of, some source code. It is quite common to do something like:
#if defined(foo)
#endif
#define foo
#include <header file>
|
|
|
|
|
I am doing Interprocess communication between a C console app and C++ Windows app
The C console app is the parent process
I have the Window handle (main window MainFrame) of the C++ child app I use SendNotifymessage
to tell the child app that console app has data for it in shared storage
The First time I do this all is well
The Second time around I have created a modless dialog box with a Crichedit control
it is at this time where I get a asseration from the SendNotifyMessage in the console C app
The assetration is dlgcore.cpp
at the parent GetSafeHWnd
lpDialogTemplate = (DLGTEMPLATE*)GlobalLock(hTemplate);
m_nModalResult = -1;
m_nFlags |= WF_CONTINUEMODAL;
AfxHookWindowCreate(this);
hWnd = ::CreateDialogIndirect(hInst, lpDialogTemplate,
pParentWnd->GetSafeHwnd(), AfxDlgProc);
#ifdef _DEBUG
dwError = ::GetLastError();
#endif
}
CATCH_ALL(e)
{
|
|
|
|
|
pParentWnd is NULL or the window has not yet been created (it's HWND member is NULL).
I can give no more help because you did not show the relevant code parts (the posted code seems to be MFC source).
|
|
|
|
|
The Hwnd is a main Window it is set to a value
i'll go into assembly mode and double check
|
|
|
|
|
Why are you using pParentWnd->GetSafeHwnd() to get your HWND? You should just use GetSafeHwnd() on its own.
|
|
|
|
|
thing is I don't know how the code got to dlgcore.cpp The Hwnd is a MainWindow
Okay thanks
|
|
|
|
|
It gets to dlgcore by virtue of your call to SendNotifyMessage , at which point it asserts because the handle you sent it is not valid.
|
|
|
|
|
But the Window Handle is a Main or Mainframe Window
I did a FindWindow api call
To get the handle As the parent is a C console app and it did work once before I created the modless dialog box in the child process
|
|
|
|
|
But you are calling pParentWnd->GetSafeHwnd() in a console app which makes no sense. What does pParentWnd point to?
|
|
|
|
|
Hi
I am at work now however the only thing I can think of at this point is that I have to use DuplicateHandle to make the child main window accessible to the parent
|
|
|
|
|
No, you just need to find its handle by one of the enumerate functions, or get the child to pass it back in some way. A handle is just a pointer used to identify a Window so you can send messages to it. To be honest, I am not exactly clear about what you are trying to do beyond the basic SendMessage function.
|
|
|
|
|
"EnumThreadWindows"
My questions in Windows is a threadID unique throughout Windows
Thanksp
|
|
|
|
|
I would assume yes, since in the case of EnumThreadWindows , the threadid is the only information Windows needs to return the information.
|
|
|
|