|
VuNic wrote: strcpy(ch, (LPSTR)(LPCTSTR)cs);
Why the unnecessary casts?
"Old age is like a bank account. You withdraw later in life what you have deposited along the way." - Unknown
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
|
|
|
|
|
Valid question. Actually I typed my reply with a char* .
char* ch = (LPSTR)(LPCTSTR)cs;
But knew that's a bad example. So changed that to char[] & and put the example as copy-the-buffer but had left the LPSTR caste unremoved . LPSTR is not need actually in this case.
He never answers anyone who replies to him. I've taken to calling him a retard, which is not fair to retards everywhere.-Christian Graus
|
|
|
|
|
VuNic wrote: LPSTR is not need actually in this case.
Neither cast is needed. Just use:
strcpy(ch, cs);
"Old age is like a bank account. You withdraw later in life what you have deposited along the way." - Unknown
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
|
|
|
|
|
Yes we've been discussing that it returns a const char by default. The reason why I used LPCTSTR is that I couldn't cast it straight to char*. As CString doesn't support non-const version. I'm stupid I didn't think before typing. So we don't need all these caste craps when you are copying the buffer.
He never answers anyone who replies to him. I've taken to calling him a retard, which is not fair to retards everywhere.-Christian Graus
|
|
|
|
|
I have the following codes:
double Length0(double x1, double y1, double z1, double x2, double y2, double z2)
{
double dx = x2 - x1;
double dy = y2 - y1;
double dz = z2 - z1;
return (dx*dx + dy*dy + dz*dz);
}
double Length1(double x1, double y1, double z1, double x2, double y2, double z2)
{
return ((x2 - x1)*(x2 - x1) + (y2 - y1)*(y2 - y1) + (z2 - z1)*(z2 - z1));
}
Assume all other conditions are the same, which one (Length0 or Length1) theoretically executes faster?
A bit explanation is highly appreciated.
|
|
|
|
|
With optimisations on, both the same - common sub-expression elimination should reduce Length1 to the equivalent of Length0 , except with the variables in registers rather than on the stack.
With optimisations off...probably Length0 is more efficient.
Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p
|
|
|
|
|
probably negligible with modern compilers.
This signature was proudly tested on animals.
|
|
|
|
|
Below is the assembly code generated by Visual Studio 2008 for both the functions.
The code was generated with full optimization.
?Length0@@YANNNNNNN@Z PROC
fld QWORD PTR _x2$[esp-4]
fsub QWORD PTR _x1$[esp-4]
fld QWORD PTR _y2$[esp-4]
fsub QWORD PTR _y1$[esp-4]
fld QWORD PTR _z2$[esp-4]
fsub QWORD PTR _z1$[esp-4]
fld ST(1)
fmulp ST(2), ST(0)
fld ST(2)
fmulp ST(3), ST(0)
fxch ST(1)
faddp ST(2), ST(0)
fmul ST(0), ST(0)
faddp ST(1), ST(0)
ret 0
?Length0@@YANNNNNNN@Z ENDP
?Length1@@YANNNNNNN@Z PROC
fld QWORD PTR _x2$[esp-4]
fsub QWORD PTR _x1$[esp-4]
fld QWORD PTR _y2$[esp-4]
fsub QWORD PTR _y1$[esp-4]
fld QWORD PTR _z2$[esp-4]
fsub QWORD PTR _z1$[esp-4]
fld ST(1)
fmulp ST(2), ST(0)
fld ST(2)
fmulp ST(3), ST(0)
fxch ST(1)
faddp ST(2), ST(0)
fmul ST(0), ST(0)
faddp ST(1), ST(0)
ret 0
?Length1@@YANNNNNNN@Z ENDP
Here you will notice that both are exactly the same.
The compiler has taken away the responsibility from the programmer about optimizing code. At least a lot of it.
«_Superman_»
I love work. It gives me something to do between weekends.
|
|
|
|
|
yellowine wrote: double Length0(double x1, double y1, double z1, double x2, double y2, double z2)
{
double dx = x2 - x1;
double dy = y2 - y1;
double dz = z2 - z1;
return (dx*dx + dy*dy + dz*dz);
}
You can see no specific improvements with that change there. but on the other hand There would be some improvements with the first case (length0), If the calculations happen inside a loop. just a rough example:
double y1, double z1, double x2, double y2, double z2)
{
double dx = x2 - x1;
double dy = y2 - y1;
double dz = z2 - z1;
double result =0.0;
for(int i=xx;i<yx;i++)>
{
result += (dx* i + dy * i + dz * i);
}
return result;
}
There it would make sense to keep them out of the loop and see some performance improvements.
He never answers anyone who replies to him. I've taken to calling him a retard, which is not fair to retards everywhere.-Christian Graus
|
|
|
|
|
Hello Everybody,
I have a file Abc.txt with the following contents
Testing
]]>
In the above contents, I have to replace only the "cdef" present in the starting of the file, with some numbers say "1234". I couldn't able to do it using the CFile class. I have done a alternative way, by reading the contents and replacing the word and then re-create the file with the same name. I don't want to recreate the file instead I have to replace the string. Please help in solving this issue.
Thanks,
Neelesh K J Jain.
|
|
|
|
|
No cookie for you: you've just found the only viable solution and discarded it badly.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
|
|
|
|
|
CPallini wrote: No cookie for you: you've just found the only viable solution and discarded it badly.
I'm proposing this for the most memorable quotes of CP for this year.
It is a crappy thing, but it's life -^ Carlo Pallini
|
|
|
|
|
Well,to be included, the sentence must be really memorable, I suppose the OP should try harder, the next time..
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
|
|
|
|
|
I have a multi-tabbed app that on exit is trying to override the OnAppExit() function to call a bit of house claening code so that I don't have a memory leak. My problem is that if I use the file->menu->exit route it will call the OnAppExit() function and I can call my function to house clean. But if I close by using the X in the upper right pane it never calls the exit function and a leak occurs. I have tried all I know to figure out why but am lost so here I am. I am fairly green to MFC so any tips or help would be appreiceated. The code that I have done is:
void CdatamaxApp::OnAppExit()
{
if( IsOnline() == TRUE )
{
int nRetValue;
nRetValue = MessageBox( NULL,"Still ONLINE, YES to Quit, NO returns to App", TEXT("Datamax Exit"), MB_ICONERROR|MB_YESNO );
if(nRetValue == IDYES)
{
OnGoOffline();
AfxGetMainWnd()->;PostMessage ( WM_CLOSE );
}
else
{
}
}
else
{
AfxGetMainWnd()->;PostMessage ( WM_CLOSE );
}
}
How can I debug or set a breakpoint to figure out why this function doesn't get called when I close app with the x close button vs using the file menu, don't they both issue the same event?
|
|
|
|
|
You're probably best off overriding CWinApp 's ExitInstance method? That should be called whatever (standard) mechanism you use to exit the application.
Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p
|
|
|
|
|
Thanks for the feedback, it does work to call ExitInstance(). I think the answer is yes but I no longer need to post message to WM_CLOSE window as I was doing before, it workS without the call but just wanted to make sure that nothing else is needed inside the ExitInstance when it is called other than my own code.
|
|
|
|
|
TimmySRX wrote: but just wanted to make sure that nothing else is needed inside the ExitInstance
Then call the base implementation also. It's the only way to be sure.
This code is taken from the documentation for ExitInstance (You do read those, I hope?)
int CMySampleApp::ExitInstance()
{
if ( m_pMySampleMem )
delete m_pMySampleMem;
DoCleanup();
return CWinApp::ExitInstance();
}
This is good practise for any MFC thing you override. You don't always want to do it, but you should make a conscious decision about it.
Iain.
Codeproject MVP for C++, I can't believe it's for my lounge posts...
|
|
|
|
|
(I've now spent the last 2½ hours trying to get this to work. I've read something like 60 pages on google.).
I'm trying to get the SendKeys for C++ to work, but to no avail.
I have tried what I think is all possible variations of SendKeys.h, windows.h, StdAfx.h and "#define _WIN32_WINNT 0x0501" (I have seen 0x0501, 500, 400, 401, 503, 510... Everyone says that what they say work. Well... no.). I simply cannot include that INPUT object (error C2065: 'INPUT' : undeclared identifier).
I am quite certain that all I need is to have ~5 rows of code in the right place. Which are these codes, and in which order should they be?
I'm using Visual C++ 6.0 (I also have the 2008 version available) with Windows XP SP2.
Now, I suppose you are supposed to do something like this:
1. Create a win32 project in visual c++ 6.0
2. Add a main.cpp file which has the main function in it
3. Add the SendKeys.cpp, StdAfk.cpp, SendKeys.h, StdAfx.h and resource.h files to the project (right-click -> add files to folder?)
4. Write something weird at the very beginning of StdAfx.h
5. Include the right things in my main.cpp
6. Create the main function, then create a CSendKeys object and then use it
7... here on, I could probably follow the official guide.
Which of the above is wrong?
|
|
|
|
|
Ran4 wrote: 4. Write something weird at the very beginning of StdAfx.h
ROTFLMAO Yeah that's the technical term for it!
Ran4 wrote: Which of the above is wrong?
You are, you're the one that's wrong. You apparently believe you should be able to create software without actually knowing what you are doing. I hope you don't find yourself in the hands of some surgeon that thinks the same way.
|
|
|
|
|
Huh? What are you talking about? What do you get out of being rude?
I want to create a program, something is in the way of that (this problem), and this is a place where I can hopefully learn how to do it. Learning your compiler is nearly impossible without someone helping you, as you know yourself.
|
|
|
|
|
Well, I should admit: learning led mike's compiler is troublesome...
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
modified on Monday, March 2, 2009 4:28 PM
|
|
|
|
|
SendKeys is for the .Net platform.
You should be using SendInput .
«_Superman_»
I love work. It gives me something to do between weekends.
|
|
|
|
|
I struggled a bit with SendInput, (which you should prefer to use) and I learned the following...
in the MSDN documentation, the call to SendInput must include a size of your input structure.
If you get it wrong, SendInput will do nothing, and not tell you.
Try something like...
<br />
#include <WinAble.h><br />
<br />
#define _MAX_KBDINPUT_LENGTH_ 50<br />
<br />
INPUT KBa[ _MAX_KBDINPUT_LENGTH_ ];<br />
::ZeroMemory(KBa, sizeof(KBa));<br />
<br />
UINT KBn = 0;
<br />
Stuff the KBa array with KEYEVENTF_KEYUP and KEYEVENTF_KEYDN (0) messages. like this...<br />
<br />
KBa[KBn].type = INPUT_KEYBOARD;<br />
KBa[KBn].ki.wVk = wVk;<br />
KBa[KBn].ki.wScan = wScan;<br />
KBa[KBn].ki.dwFlags = 0;
KBn++;<br />
KBa[KBn].type = INPUT_KEYBOARD;<br />
KBa[KBn].ki.wVk = wVk;<br />
KBa[KBn].ki.wScan = wScan;<br />
KBa[KBn].ki.dwFlags = KEYEVENTF_KEYUP;<br />
KBn++;<br />
<br />
Then, set focus to the target window. If its not a window your process owns, you must do the following<br />
<br />
DWORD tWNDthread = ::GetWindowThreadProcessId(hwndTARGET,0);<br />
if (!tWNDthread)<br />
{<br />
AfxMessageBox("zSendKeys FAILED to get ABF Thread Id!");<br />
bValid = FALSE;<br />
}<br />
<br />
BOOL bAttached = FALSE;<br />
bAttached = AttachThreadInput(GetCurrentThreadId(),tWNDthread,TRUE);
<br />
if ( bAttached )<br />
{<br />
::SetForegroundWindow(hwndTARGET);
::SetFocus(hwndTARGET);
<br />
AttachThreadInput(GetCurrentThreadId(),tWNDthread,FALSE);
<br />
} else<br />
{<br />
AfxMessageBox("zSendKeys FAILED to attach to ABF Thread Id!");<br />
bValid = FALSE;<br />
}<br />
<br />
if (bValid) bValid = ::SendInput(KBn,&KBa[0],sizeof(INPUT));
<br />
::SetForegroundWindow(hME);<br />
::SetFocus(hME);<br />
I know this is MFC-centric, and not generic C, but I hope it helps you
-Dave
|
|
|
|
|
For starters, you might as well use the deprecated keybd_event function.
«_Superman_»
I love work. It gives me something to do between weekends.
|
|
|
|
|
Hello,
I am trying to compile this small dll function and am getting a linking error can someone help....Please....I am using Visual Studio 2008.
The error i get when i build is error LNK2019: unresolved external symbol _DetourTransactionBegin@0 referenced in function _DllMain@12
Here is the code.
Can someone help..Please
#include "stdafx.h"
#include "detours.h"
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
DetourTransactionBegin();
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
DetourTransactionBegin();
break;
}
return TRUE;
}
thanks A Million.
|
|
|
|
|