|
I don't know of any limitations beyond what's mentioned in the programming considerations here[^]
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
I'm trying to figure out how to place a loop in this program that will take input from the user after each iteration, ask to continue, and restart or exit the program. I've tried everything, I just don't know how to do it. Will someone please take a look at this code and maybe put the loop statements in the right spots? I'm really lost and I just need this one example done so I can understand it and move on. Thanks.
#include <iostream>
int getMonth();
// Precondition: User will enter birth month
// Postcondition: Returns 1 <= birth month <= 12
int getDay();
// Precondition: User will enter birth day
// Postcondition: Returns 1 <= birth day <= 31
int getSign(int month, int day);
// Precondition: 1 <= month <= 12, 1 <= day <= 31
// Postcondition: Returns integer corresponding to astrological sign for
// given month and day starting with Capricorn = 1.
int main()
{
using namespace std;
int month;
int day;
//
// Get birth month and day.
//
month = getMonth();
day = getDay();
//
// Determine and print the user's sign
//
cout << "Your sign is ";
// --------------------------------
// ----- ENTER YOUR CODE HERE -----
// --------------------------------
switch (month)
{
case 1:
if (day <= 19)
cout << "Capricorn.";
else
cout <<"Aquarius.";
break;
case 2:
if (day <= 18)
cout << "Aquarius.";
else
cout <<"Pisces.";
break;
case 3:
if (day <= 20)
cout << "Pisces.";
else
cout <<"Aries.";
break;
case 4:
if (day <= 19)
cout << "Pisces.";
else
cout <<"Taurus.";
break;
case 5:
if (day <= 20)
cout << "Taurus.";
else
cout <<"Gemini.";
break;
case 6:
if (day <= 20)
cout << "Gemini.";
else
cout <<"Cancer.";
break;
case 7:
if (day <= 22)
cout << "Cancer.";
else
cout <<"Leo.";
break;
case 8:
if (day <= 22)
cout << "Leo.";
else
cout <<"Virgo.";
break;
case 9:
if (day <= 22)
cout << "Virgo.";
else
cout <<"Libra.";
break;
case 10:
if (day <= 22)
cout << "Libra.";
else
cout <<"Scorpio.";
break;
case 11:
if (day <= 21)
cout << "Scorpio.";
else
cout <<"Sagittarius.";
break;
case 12:
if (day <= 21)
cout << "Sagittarius.";
else
cout <<"Capricorn.";
break;
}
// --------------------------------
// --------- END USER CODE --------
// --------------------------------
cout << endl;
cout << "Do you want to continue? (Y/N)\n";
}
int getMonth()
{
using namespace std;
int month;
cout << "Enter the month of your birthday (1-12): ";
cin >> month;
while ((month < 1) || (month > 12))
{
cout << "Month must be between 1 and 12; please re-enter: ";
cin >> month;
}
return month;
}
int getDay()
{
using namespace std;
int day;
cout << "Enter the day of your birthday (1-31): ";
cin >> day;
while ((day < 0) || (day > 31))
{
cout << "Day must be between 1 and 31; please re-enter: ";
cin >> day;
}
return day;
}
|
|
|
|
|
Probably you miss the right locations for the code placeholders.
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
|
|
|
|
|
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
|
|
|
|