|
Well I think I didn't think about it correctly, cuz when I think about it again I found that the int ** seems to have better performance than the 1D array implemenation, and it may be not related to how data is near to each other.
The int ** needs 4 mov micro instruction to get the effective address, while the 1D needs 2 mov, one multiplication (which I think more costy and which make the whole overhead) and one addition operation to get the effective address.
This is the assembly code for getting the effective address in the 1D implementation for a matrix 10 x 10 to access element (i, j)
ar[j * w + i] = 5;
mov eax,dword ptr [j]
imul eax,dword ptr [w]
add eax,dword ptr [i]
mov ecx,dword ptr [ar]
mov dword ptr [ecx+eax*4],5
This is code for the int ** implementation for a matrix 10 x 10
ar[i][j] = 5;
mov eax,dword ptr [i]
mov ecx,dword ptr [ar]
mov edx,dword ptr [ecx+eax*4]
mov eax,dword ptr [j]
mov dword ptr [edx+eax*4],5
however, I found that the the 1D representation is more commonly used for example, this is how the same thing work for a static 2D array declared in the compiler:
ar[i][j] = 5;
mov eax,dword ptr [i]
imul eax,eax,28h
lea ecx,ar[eax]
mov edx,dword ptr [j]
mov dword ptr [ecx+edx*4],5
If you checked it thourougly you will find that it's similar to the 1D, but it has optimization due to previous knowledge of the array size.
[All assembly code is obtained using VC++ debugging disassembly]
This approach is useful in data serializzation since serialization can be done using single call to I/O device, bitmaps for example are stored in memory as a single 1D array.
I hope if anyone has more infomation about this issue shares it with us, cuz am more curios about it.
|
|
|
|
|
W. Richard Stevens:
Advanced Programming in the UNIX(R) Environment(my price:$30, amazon's price:$69.99)
UNIX Network Programming Volume1 2nd Ed.(my price:$30, amazon's price:$69.93)
UNIX Network Programming Volume 2 : (my price:$30, amazon's price:$66)
TCP/IP Illustrated, Volume 1:(my price:$30, amazon's price:$69.99)
TCP/IP Illustrated, Volume 2:(my price:$35, amazon's price:$69.99)
TCP/IP Illustrated, Volume 3:(my price:$30, amazon's price:$54.99)
volume 1-3(my price:$85)
Bjarne Stroustrup:
The c++ programming Language(Special Edition)(my price:$32, amazon's price:$64.99)
The Design and Evolution of c++ (my price:$20, amazon's price:$44.99)
scott meyers:
effective c++(my price:$20, amazon's price:$37.95)
effective STL(my price:$25, amazon's price:$39.99)
Andrei Alexandrescu:
Modern C++ Design(my price:$20, amazon's price:$42.99)
Brian w.Kernighan:
The Practice of Programming(my price:$20, amazon's price:$26.99)
Erich Gamma:
Design Patterns(my price:$25, amazon's price:$54.99)
Alan Shalloway:
Design Patterns Explained(my price:$25, amazon's price:$39.99)
Martin Fowler:
Refactoring(my price:$27, amazon's price:$49.99)
All of these are new.Some books are not list,if you are
interested in them,please send me an E-mail.(chester163@hotmail.com)
code,code,code...
chester163@hotmail.com
|
|
|
|
|
SPAMMER
Neville Franks, Author of ED for Windows. Free Trial at www.getsoft.com
|
|
|
|
|
|
he/she probably voted for himself.
// Afterall, I realized that even my comment lines have bugs
When one cannot invent, one must at least improve (in bed).-My latest fortune cookie
|
|
|
|
|
I have a modeless dialog box where I create all the controls myself in the WM_INITDIALOG message. My question is how to set the tab order of these controls. (Don't ask why I'm not creating them in the dialog resource )
Thanks,
Melekor
|
|
|
|
|
The tab order is determined by the Z order of the controls. You'll need to use SetWindowPos() to position the controls after one another in the desired order.
--Mike--
"So where does that leave us? Well, it leaves us right back where we started, only more confused than before." -- Matt Gullett
Ericahist | Homepage | RightClick-Encrypt | 1ClickPicGrabber
|
|
|
|
|
That sounds good, but I guess I don't know how to use it right because it's not working.
I created this
<br />
Inline void IncZOrder(HWND hWnd)<br />
{<br />
static HWND LastWindowCreated = 0;<br />
SetWindowPos(hWnd, LastWindowCreated, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);<br />
LastWindowCreated = hWnd;<br />
}<br />
now after I create every control, I call that function with its hWnd but it doesn't work, I still can't tab between the controls. I'm pretty sure my message pump is correct to handle dialogs:
<br />
while(GetMessage(&msg, NULL, 0, 0) > 0)<br />
{<br />
HWND ActiveWindow = GetActiveWindow();<br />
<br />
if(!IsWindow(ActiveWindow) || !IsDialogMessage(ActiveWindow, &msg))<br />
{<br />
TranslateMessage(&msg);<br />
DispatchMessage(&msg);<br />
}<br />
}<br />
What else do I need to do?
Thanks!
|
|
|
|
|
Are you setting the Tabstop Style for the controls you want to Tab between?
Neville Franks, Author of ED for Windows. Free Trial at www.getsoft.com
|
|
|
|
|
WS_TABSTOP! I didn't even know that style existed.
Thank you Michael and Neville, with your two suggestions together, it is now working like a charm
|
|
|
|
|
I have a problem. I see the text within a box on the screen in one font size, then when I look at the output, it wants to print it bigger than the area.
Can anyone give me a hint on how to set the printed size so if fits within the area?
|
|
|
|
|
I'm trying to create a small jukebox. Do the .wav files need to be placed in the "resources" folder or no? Also, can mp3's be used. Where are these type files normally stored?
Thanks
|
|
|
|
|
Firends i am having a problem and i like your advice in this regard. I would appreciate the non-MFC answer.
I've a thread. The purpose of this thread is to read string from somewhere and then display it on the console. Lets call it thread A. So simple, so easy.
I've two other threads. The purpose of these threads is to get some data from internet.
Now, what i want is that the two threads getting data from internet should "send" the string to thread A, so that it can be displayed. But i don't want those two threads to block. And this is the problem. Of course two threads should write string somewhere and then thread A get those strings periodically. As such critical section is necessary which i like to prevent because as such there is a blocking.
In order to overcome the problem i am using IO completion ports. But the problem is that IOCP is not available in Win9X family operating systems.
So what you like to advice me.
|
|
|
|
|
If it's simply a reader/writer paradigm, why not use a volatile string in the calling thread and write static Get/Set member functions that can be called via a pointer to the calling thread?
- Nitron
"Those that say a task is impossible shouldn't interrupt the ones who are doing it." - Chinese Proverb
|
|
|
|
|
Nitron wrote:
If it's simply a reader/writer paradigm,
No, its not simply like that. I need to implement some sort of message queue just like IO completion port.
|
|
|
|
|
One solution is a queue STL container. Pop and insert new messages as string objects.
Kuphryn
|
|
|
|
|
kuphryn wrote:
One solution is a queue STL container.
But as such i need to make this queue thread safe using critical section; otherwise two different threads may want to read and write at this object the same time.
|
|
|
|
|
|
You can't avoid that...
Though the other cheap way, is to post messages to your own window. You can pass the strings by converting them to atom's (see GlobalAddAtom). If you don't have a window, then go back to plan A as mentioned above.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br />
Peter Weyzen<br />
Staff Engineer<br />
Santa Cruz Networks
|
|
|
|
|
Read the docs for PostThreadMessage().
It will explain how to create a message queue for your thread A (dead easy).
Threads B, C can then call PostThreadMessage(thread_A, MY_STR_MSG, char*, length).
Thread A (even though it doesn't have a window) can use the normal window GetMessage() loop to pull the strings from the message queue.
Probably want to alloc memory for strings in threads B,C and delete in thread A.
...cmk
|
|
|
|
|
Can I set a ProgressBar's postion in a static CALLBACK function? For instance:
......
//{{AFX_DATA(CFormatNT)
enum { IDD = IDD_DIALOG_FORMAT };
CProgressCtrl m_progress;
//}}AFX_DATA
.....
static BOOL CALLBACK FormatDiskCallback( ...);
.......
BOOL CALLBACK CFormatNT::FormatDiskCallback(..)
{
......
m_progress.SetPos(10);
......
}
When I compile it, there is an error as below:
error C2228: left of '.SetPos' must have class/struct/union type
What is the problem? How to solve it?
Thank you in advance!
|
|
|
|
|
A static method can't access non-static member variables. You'll need to pass a pointer to either this or just the CProgressCtrl to the callback function.
--Mike--
"So where does that leave us? Well, it leaves us right back where we started, only more confused than before." -- Matt Gullett
Ericahist | Homepage | RightClick-Encrypt | 1ClickPicGrabber
|
|
|
|
|
In the head file----------------
//{{AFX_DATA(CFormatNT)
enum { IDD = IDD_DIALOG_FORMAT };
CProgressCtrl m_progress;
//}}AFX_DATA
.....
-------------------------------------
static BOOL CALLBACK FormatDiskCallback( ...,CProgressCtrl progressBar);
static void PrintOut(...PFMIFSCALLBACK FormatExCallback,CProgressCtrl m_progress);
.......
In the implementation file-----------------------------------------
typedef BOOL (CALLBACK *PFMIFSCALLBACK)( ...,CProgressCtrl progressBar );
-------------------------
BOOL CALLBACK CFormatNT::FormatDiskCallback(...,CProgressCtrl progressBar)
{
......
m_progress.SetPos(10);
......
}
void CFormatNT::PrintOut(..., PFMIFSCALLBACK FormatExCallback,CProgressCtrl m_progress)
{
....
FormatExCallback(...,m_progress);
}
...
PrintOut(...,m_progress);
...
Compile it, and the result is:
error C2664: 'PrintOut' : cannot convert parameter 3 from 'class CProgressCtrl' to 'class CProgressCtrl'
What is the problem? And how to solve it?
|
|
|
|
|
Now I have completed the function by using another new thread.
Not handling the CProgressCtl varible in the static function.
|
|
|
|
|
how to play *.ani file in MFC?
I dont want to use the function "LoadCursorFromFile"
I want to use it as a resource.
How do i do!
|
|
|
|
|