|
Dear friends,
I want advice regarding the efficient way of string searching. I got a text file in which about ten thousand english words are written (one word per line). All the words are arranged in alpabetical order.
Now you all people are aware of the intellisense feature of Visual studio. I also want to give like same feature in my application. There is a rich text box in my application. What i want is that whenever user type any word, a combo box automatically gets open and show all the words that starts from the first letter typed by the user, when user type second letter, the combo list decrease and only show those words having first and second letters same as what typed by user.
Letme give you example. If you have Win2k/XP, just go to start menu, and open the "Run" dialog box. Then type, c:\winnt\system32\s you will notice that as you type it, the combobox automatically expands showing the names of files or folders. The maximum files are in system32 and when you type any file name after typing system32\ then you may notice that how fast the operation of file sorting performed by the application to expand or contract the combo box.
I also want something like what i described above in my application. I have 10,000 words in text file. Now can anyone tell me that how can i efficiently perform this operation i.e how and when i load file. Do i need any appropriate STL container. How to perform string searching on the basis of characters typed by user e.t.c
Thanks.
|
|
|
|
|
Dictionary lookup is customarily implemented using a special kind of structures called tries. I'm afraid STL does not provide such a container, but possibly googling around will dig out some suitable library.
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
|
I mean trie; it is a very remarkable structure that stores data in an efficient way both space- and looukp-wise. For instance, if the three words "the", "thunk" and "thunder" are stored in the trie, the following structure would result:
|->e
th->| |->k
|->un->|
|->der Hope you get the idea. There's an excellent article in CodeProject wich explains some more about tries, R. Reyes' Optimized IP to ISO3166 Country Code Mapping in C#[^], although it is for C# only.
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
ups, that was kinda new to me, thx for the info.
|
|
|
|
|
Maybe looking into Bioinformatics can help you. These guys regularily solve the problems of searching through really huge amounts of letters (Genomics data) and find the spot where a given substring resides.
Just google..
My opinions may have changed, but not the fact that I am right.
|
|
|
|
|
You could load you list of words into a hash table of some sort.
Of cource you could use this very simple method:
(ASCII only solution)
class CIndexWhatEver
{
int m_Start, m_End;
....
};
Now create 2 arrays one to hold your list of strings and one to hold a list of CIndexWhatEver items. While you are loading your list into a CStringArray simply keep track of the ranges and add them to CIndexWhatEverArry. This works with ASCII to reduce search to range of strings starting with the given character.
int FindWhatEver(LPCTSTR lpStr)
{
TCHAR chStart = tolower(*lpStr);
// if in ranage 'a'-'z'
...
int nStart, nEnd;
m_WhatEverArray.GetRange(chStart-_T('a'),&nStart,&nEnd);
for( int i=nStart; i
|
|
|
|
|
Whoops! I should have use preview. But even though the FindWhatEver() code was trucated I thik the general idea is still clear
Trust in the code Luke. Yea right!
|
|
|
|
|
When I browse a file under a share folder in server, if the folder is a mapped drive in my computer. I will get the file path like Z:\\abc.dll, how
can I translate it to a UNC path like \\\Server\\Open\\abc.dll.
Liu Xilin
|
|
|
|
|
following is from msdn :
To find the UNC path associated with a mapped network drive letter, follow these steps:
1.Create a module and type the following lines in the Declarations section:
Option Explicit
' These represent the possible returns errors from API.
Public Const ERROR_BAD_DEVICE = 1200&
Public Const ERROR_CONNECTION_UNAVAIL = 1201&
Public Const ERROR_EXTENDED_ERROR = 1208&
Public Const ERROR_MORE_DATA = 234
Public Const ERROR_NOT_SUPPORTED = 50&
Public Const ERROR_NO_NET_OR_BAD_PATH = 1203&
Public Const ERROR_NO_NETWORK = 1222&
Public Const ERROR_NOT_CONNECTED = 2250&
Public Const NO_ERROR = 0
' This API declaration is used to return the
' UNC path from a drive letter.
Declare Function WNetGetConnection Lib "mpr.dll" Alias _
"WNetGetConnectionA" _
(ByVal lpszLocalName As String, _
ByVal lpszRemoteName As String, _
cbRemoteName As Long) As Long
2.Type the following procedure:
Function GetUNCPath(strDriveLetter As String) As String
On Local Error GoTo GetUNCPath_Err
Dim Msg As String, lngReturn As Long
Dim lpszLocalName As String
Dim lpszRemoteName As String
Dim cbRemoteName As Long
lpszLocalName = strDriveLetter
lpszRemoteName = String$(255, Chr$(32))
cbRemoteName = Len(lpszRemoteName)
lngReturn = WNetGetConnection(lpszLocalName, _
lpszRemoteName, _
cbRemoteName)
Select Case lngReturn
Case ERROR_BAD_DEVICE
Msg = "Error: Bad Device"
Case ERROR_CONNECTION_UNAVAIL
Msg = "Error: Connection Un-Available"
Case ERROR_EXTENDED_ERROR
Msg = "Error: Extended Error"
Case ERROR_MORE_DATA
Msg = "Error: More Data"
Case ERROR_NOT_SUPPORTED
Msg = "Error: Feature not Supported"
Case ERROR_NO_NET_OR_BAD_PATH
Msg = "Error: No Network Available or Bad Path"
Case ERROR_NO_NETWORK
Msg = "Error: No Network Available"
Case ERROR_NOT_CONNECTED
Msg = "Error: Not Connected"
Case NO_ERROR
' all is successful...
End Select
If Len(Msg) Then
MsgBox Msg, vbInformation
Else
' Display the path in a Message box or return
' the UNC through the function.
MsgBox Left$(lpszRemoteName, cbRemoteName)
GetUNCPath = Left$(lpszRemoteName, cbRemoteName)
End If
GetUNCPath_End:
Exit Function
GetUNCPath_Err:
MsgBox Err.Description, vbInformation
Resume GetUNCPath_End
End Function
3.To test this function, type the following line in the Debug window, and then press ENTER. A simple message box appears containing the UNC path of the specified network drive letter.
?GetUNCPath("h:")
NOTE: This example assumes that you have a mapped network drive assigned to driver letter H.
Some of the possible return values for the GetUNCPath function include ERROR_BAD_DEVICE, ERROR_CONNECTION_UNAVAIL, and ERROR_NOT_CONNECTED.
Other run-time errors could be returned from the function and error trapping should be implemented.
|
|
|
|
|
;PI have posted this question in codeguru but none reply me. My question is:
How to get a particular line height in the CRichEditCtrl. For instance, the RichEditCtrl contains total of 20 lines and each line use different character format(CHARFORMAT) to show the text, then, how can I know the height in pixels of 4th line?
Thanks in advance.
lauch2
|
|
|
|
|
All know that the vc has some Predefined Macros,such as __LINE__ ,__FILE__ etc.when the programmer write the code __FILE__ in the file myclass.cpp ,the compiler will convert it to "myclass.cpp". Now i want to create a macros __CLASS__,so when programmer write the code __CLASS__ in a class (such as CMyClass )function ,the compile will convert it to the class Name ("CMyClass"),can i realize that ?if can ,how?
CMyClass
{
void DisplayMyName();
}
void CMyClass::DisPlayMyName()
{
AfxMessageBox(__CLASS__);//When Compile it will be converted to AfxMessageBox("CMyClass")
}
thanks
|
|
|
|
|
You can't. Meditate upon the meaning of "predefined".
Even if you didn't have the "predefined" constraint, what you request can't be done without modifying the translator (compiler).
You can "work around" this by enforcing conventions, much like e.g. MFC does for its "runtime class" thingie, but there's nothing within the C++ language to help you out here.
|
|
|
|
|
You can do is something like this:
class CMyClass
{
static char const __CLASS__[];
...
void DisplayMyName();
}
...
char const CMyClass::__CLASS__[] = "CMyClass";
However in this case, __CLASS__ is not a macro and the value is not available at compile time. You can't do compile-time string concatenation.
|
|
|
|
|
Dear All
CString s("-1, 1, 10");
How can i get all of these three numbers out this string?
I used atof(s), but i can only get first number, -1.
How can i get rest of number, 1 and 10?
Thanks
|
|
|
|
|
you can define a function
CString getfirstparam(CString& strParam)
{
CString str,str1;
int i;
i = strParam.find(',');
str = strParam.left(i);
str1= strParam.right(strParam.Getlength()-i-1);
strParam =- str1;
return str;
}
|
|
|
|
|
|
I remember reading somewhere that pointer values in Windows do not use their high bit, so some applications attempt to use that bit for their own purposes. Can someone clarify this and/or point me to some more information on it? I'd also like to know if it's always safe to do this, and are their any other unused bits. Thanks.
|
|
|
|
|
In Windows, like VMS, the lower 2GB is user address space while the upper 2GB is reserved for the system. Thus, for user mode programs, the high bit is always zero. However, you can't go off and set that high bit and then expect to be able to dereference the pointer. It will still try to access the high memory and crash (I am 99.99999999% sure).
Tim Smith
I'm going to patent thought. I have yet to see any prior art.
|
|
|
|
|
Tim Smith wrote:
In Windows, like VMS, the lower 2GB is user address space while the upper 2GB is reserved for the system.
Yes. This is the case unless you have Win 2K advanced server or higher which allows the split to be 3GB user and 1GB system. For this to work you must set a switch during your link (/LARGEADDRESSWARE) and use the /3GB boot.ini switch. In any case you cannot use the high bit of a pointer for your own use and expect to dereference the pointer unless you reset the high bit before each use.
John
|
|
|
|
|
This is probably an easy one for the more experienced, so here goes:
I wish to copy the display of an off-the-shelf control, and display it on my own static control, via device contexts and bitmaps.
How would I go about this? I am guessing it'll go like:
HDC blah = somecontrol.GetDC();
CDC memDC;
memDC.CreateCompatibleDC(&blah);
myStaticControldc.BitBlt(0, 0, m_bmInfoDisplay.bmWidth, m_bmInfoDisplay.bmHeight, &memDC.dcMemory, 0, 0, SRCCOPY);
but am not having much luck so far...
Help! Please
Cheers,
Dave
|
|
|
|
|
Question is what is it suppose to do?
1) HDC blah = somecontrol.GetDC();
2) CDC memDC;
memDC.CreateCompatibleDC(&blah);
3) myStaticControldc.BitBlt(0, 0, m_bmInfoDisplay.bmWidth, m_bmInfoDisplay.bmHeight, &memDC.dcMemory, 0, 0, SRCCOPY);
1) Anything you "get" give back.. You need ReleaseDC.
2) Creates new empty CDC compatible with blah? (Why?)
3) Step 3 makes a copy of newly created empty dc into static!?
====
You need to attach control dc, and bitblt it to static.
|
|
|
|
|
I have to be able to get the bitmap from a control, so i can separately draw onto the image in my own static control. Here's revision 2:
pWnd = pDC->GetWindow(); //Get Window of PDC
pWnd->GetClientRect(&rect); //Get dimension of Window
CDC memdc;
memdc.CreateCompatibleDC(pDC); //Make Compatible DC for memdc
m_bmDisplay.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());
Create Compatible DDB
pOldBmp=memdc.SelectObject(&m_bmDisplay);
memdc.BitBlt(0,0,rect.Width(),rect.Height(),pDC,0,0,SRCCOPY);
memdc.SelectObject(pOldBmp);
m_bmDisplay.GetObject(sizeof(m_bmInfoDisplay), &m_bmInfoDisplay);
Cheers,
Dave
|
|
|
|
|
Ok the entire section i have is:
BOOL CGraphStatic::SetBitmap(CDC *pDC)
{
CBitmap *pOldBmp;
CRect rect, thisRect;
CWnd *pWnd;
if(pDC==NULL)
{
AfxMessageBox("DC Not Found");
return FALSE;
}
pWnd = pDC->GetWindow(); //Get Window of PDC
pWnd->GetClientRect(&rect); //Get dimension of Window
CDC memdc;
memdc.CreateCompatibleDC(pDC); //Make Compatible DC for memdc
m_bmDisplay.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());
//Create Compatible DDB
pOldBmp=memdc.SelectObject(&m_bmDisplay);
memdc.BitBlt(0,0,rect.Width(),rect.Height(),pDC,0,0,SRCCOPY);
memdc.SelectObject(pOldBmp);
m_bmDisplay.GetObject(sizeof(m_bmInfoDisplay), &m_bmInfoDisplay);
this->GetClientRect(&thisRect);
rect.right = rect.left + m_bmInfoDisplay.bmWidth + 2;
rect.bottom = rect.top + m_bmInfoDisplay.bmHeight + 2;
SetWindowPos(NULL, 0, 0, rect.Width(), rect.Height(), SWP_NOZORDER | SWP_NOMOVE);
m_bAssigned = TRUE;
return TRUE;
}
and,
in my OnPaint function for the static control (the draw struct code borrowed from somewhere, can't recall where)
if (m_bAssigned == TRUE){
if (m_cdcBufDisplay.bValid == FALSE)
{
m_cdcBufDisplay.dcMemory.CreateCompatibleDC(&dc);
m_cdcBufDisplay.pOldBmp = m_cdcBufDisplay.dcMemory.SelectObject(&m_bmDisplay);
m_cdcBufDisplay.bValid = TRUE;
}
dc.BitBlt(0, 0, m_bmInfoDisplay.bmWidth, m_bmInfoDisplay.bmHeight, &m_cdcBufDisplay.dcMemory, 0, 0, SRCCOPY);
}
If i call setbitmap on dialog initialisation, i will get at least something in the control, but anywhere else and nothing gets drawn
Cheers,
Dave
|
|
|
|
|
Your DDB SetBitmap looks fine...
Have you checked if m_bmDisplay.GetObject(sizeof(m_bmInfoDisplay), &m_bmInfoDisplay); returns correct dimentions?
Have you tried commenting // if (m_cdcBufDisplay.bValid == FALSE)
Brian
|
|
|
|
|