|
not very helpful.
thanks anyway.
|
|
|
|
|
It was just an hint: if you want a loop then you have to widen its scope, i.e. move the upper placeholder up and the lower placeholder down:
int main()
{
using namespace std;
int month;
int day;
char answer;
do
{
month = getMonth();
day = getDay();
cout << "Your sign is ";
switch (month)
{
case 1:
if (day <= 19)
cout << "Capricorn.";
else
cout << "Aquarius.";
break;
}
cout << endl;
cout << "Do you want to continue? (Y/N)\n";
cin >> answer;
} while (answer=='y' or answer=='Y');
}
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
|
|
|
|
|
int main()
{
char YesNo = 'Y';
while (YesNo == 'Y' || YesNo == 'y')
{
...put all your loop code here...
cout << endl;
cout << "Do you want to continue? (Y/N)\n";
cin >> YesNo;
}
return 0;
}
Maybe something like that will work?
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
that just creates an endless loop in the console window, repeating "Your sign is ", or the sign, depending on where it is placed?
|
|
|
|
|
Nope
you will leave the loop if you press any other char then 'y' or 'Y'
codito ergo sum
|
|
|
|
|
Thanks for the help everyone. I knew it had to be something simple. Just had my braces in the wrong place.
|
|
|
|
|
Hi all,
I would like to have a pointer(parameter) as a output of function. Is it possible??
here is my examle:
void a(char *pcOutput){
pcOutput = new char[7];// here I will get an new address of heap
strcpy(pcOutput,"Hello.\0");
}
int main(int argc, char* argv[])
{
char *pcOut = NULL;
a(pcOut);
printf("pointer: %s\n",pcOut);// I see - pointer: null
return 0;
}
What am I doing wrong?
Thank you.
|
|
|
|
|
You need to have a pointer to a pointer.
void a(char **ppcOutput)
You also need to free the memory in the main function.
|
|
|
|
|
I will try it.
Thank you for your help.
|
|
|
|
|
You are only passing your pointer by value. In order for a called function
to alter the passed value, it needs to be passed by reference...
void a(char *<font color="Red">&</font>pcOutput){
pcOutput = new char[7];
strcpy(pcOutput,"Hello.\0");
}
int main(int argc, char* argv[])
{
char *pcOut = NULL;
a(pcOut);
printf("pointer: %s\n",pcOut);
<font color="Red">delete[] pcOut;</font>
return 0;
}
or you could return a pointer...
char *a(){
char *pcOutput = new char[7];
strcpy(pcOutput,"Hello.\0");
<font color="Red"></font>return pcOutput;
}
int main(int argc, char* argv[])
{
char *pcOut = a();
printf("pointer: %s\n",pcOut);
<font color="Red">delete[] pcOut;</font>
return 0;
}
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
A reference to a char pointer. Noooooooooooooooooooooooooooooooooooooooooo!
(Sorry only personal taste )
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
|
|
|
|
|
hehe yeah, but it's perfectly valid - It's just a reference to a pointer, and a pointer is just
another data type.
Maybe "char* &" is better style...
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
char *&pcOutput
I have never seen it before.
Thank you for your help.
|
|
|
|
|
I have created a database program based on the CHCKBOOK sample provided by MS. It works fine under XP. However, when run under Vista the call to CMultiDocTemplate::CreateNewFrame results in a strange series of message boxes (with no message) that must be clicked OK 8 times before the frame and view are created. I don't see a call to a message box in my code or in the source for CreateNewFrame to account for this. Any answers? Unfortuately, I do not have Vista on the computer on which I program. Thanks.
Doug C.
|
|
|
|
|
Can you step through CreateNewFrame() to narrow down what's happening at the
time the message boxes start appearing?
Does the same thing happen if the app is run as an administrator?
If you want your app to be compatible with Vista, you really need to be able to debug on Vista
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Many Thanks. I can step thru CreateNewFrame, but the problem never shows up under XP. It shows up the same on Vista as an administrator. I guess I will have to wait until I can get set up to debug on Vista.
|
|
|
|
|
DougVC wrote: It shows up the same on Vista as an administrator
Just to make sure - that's running the app as an admin (right click the exe, choose "Run As Administrator"),
not just running it from a logged on administrator user, right?
DougVC wrote: I guess I will have to wait until I can get set up to debug on Vista
That will help a lot There's a lot going on in the creation of windows in MFC - narrowing it down
will help.
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
For what it is worth, the problem seems to be related to CPropertySheet. The window includes a property sheet with 6 pages. I get 8 extraneous message boxes bringing up the window and one, two or three such message boxes whenever I try to bring up an individual page. There is a tab control elswhere in the program, whithout the use of CPropertySheet, and this does not have a problem.
|
|
|
|
|
Hi!
I have to implement in my app a selection tool which lets users to select region of any shape in raster image (in graphics aplication it is called "free shape selection tool" or lasso). Anybody knows some free libraries or examples with source code which can be usefull? I will postpone choosing the image processing library till I get some answers from programers community
Not necessarily C++, may be also .Net classes.
|
|
|
|
|
Hello everyone,
http://msdn2.microsoft.com/en-us/library/aa271769(VS.60).aspx[^]
My current confusion is, what is the content and format of import library, especially, how magic the import library is -- so that the linker could utilize it to generate the two forms of call statement,
1. using JMP indirection, one additional indirection level;
2. smarter way, no additional indirection level.
Also, how import library referred to the IAT of the EXE during link phase, so that the loader could resolve the IAT during loading time.
The content seems too abstract and high level, and if there could be a sample, it will be great!
Any referred reading or description to my question.
thanks in advance,
George
|
|
|
|
|
Hello George,
The article in question is referring to functions imported from a DLL. When you call a function which resides in a DLL the linker generates an address pointer which will point to a thunk. A thunk is a function which accesses a table containing address translations. By default the linker will generate a 'call instruction' or JMP instruction to the thunk. This takes additional cpu cycles.
The article describes using __declspec(dllimport) which will instruct the linker that the function resides in an external DLL. Once the linker knows this, it can generate better performing code. Rather than generating a 'call instruction' the linker will generate an indirect call through the IAT entry. Essentially the linker is inlining the thunk.
For Example:
__declspec(dllimport) void Myfunction(void);
int main()
{
Myfunction();
}
generates an indirect call such as:
ff 15 00 00 00 00 call DWORD PTR __imp__Myfunction
So now the linker has generated optimized code with a single indirect call instruction. In addition to what the article mentions... if all DLL calls from the application are hinted with __declspec(dllimport) this will cause the linker to not generate thunk code which will save 6 bytes plus 1 byte per call site on the final PE image.
Hope this helps,
-Randor (David Delaune)
|
|
|
|
|
Thanks Randor!
Your reply is great! One more question, why the address of the import function (or say, the function exported by the DLL) can not be known by the linker? Because of until load time, the address of the function in the DLL is not decided? Like DLL Rebase or something?
regards,
George
|
|
|
|
|
Randor's correct in the overall behaviour but not some of the details. The compiler normally generates direct CALL instructions to call code not in the current translation unit. It leaves a direction to the linker to fill in the necessary value with the address of the corresponding symbol at link time.
The import library that you link with is what contains the JMP instructions, which look like:
MyFunc:
JMP __imp__MyFunc That's the 'import thunk'. There's one thunk per routine in the DLL that this is the import library for.
If you specify __declspec(dllimport) , the compiler instead generates an indirect call instruction and the instruction to the linker references __imp__MyFunc rather than MyFunc . When the call is made, instead of the instruction pointer going first to the thunk, then to the function itself, it goes directly to the function.
The symbol __imp__MyFunc itself actually points to a pointer-sized value in the Import Address Table which the loader (part of the OS) writes the actual address of the function to at load time.
Also included in the import library is the full Import Address Table for the DLL, which contributes to building up the IAT in the executable itself.
For more, see http://msdn.microsoft.com/msdnmag/issues/02/03/PE2/[^].
DoEvents: Generating unexpected recursion since 1991
|
|
|
|
|
Thanks Mike,
Two more comments,
1.
For the less-optimized form (if user does not specify dllimport),
jmp DWORD PTR __imp_func1
is treated as implementation function func1?
2.
How did the linker know the address of IAT table itself? It is some hard coded value or always have the same value in every PE file?
regards,
George
|
|
|
|
|
Hi friends
How to hide mouse pointer in MFC
thanks in advance
-RisKhan-
|
|
|
|