tags:

views:

36

answers:

3

The errors i am getting are:

Error 1 error LNK2019: unresolved external symbol "double __cdecl getDollarAmt(void)" (? getDollarAmt@@YANXZ) referenced in function _main hid.obj Error 2 fatal error LNK1120: 1 unresolved externals

this is my program:

 #include<iostream>
#include<cmath>
#include<string>
using namespace std;

double getDollarAmt();
void displayCurrencies();
char getCurrencySelection (float amtExchanged);
bool isSelectionValid(char selection);
double calcExchangeAmt (float amtExchanged, char selection);
void displayResults(double newAmount, float amtExchanged, char selection, char yesNo);

const double  russianRubles = 31.168;
const double northKoreanWon = .385;
const double chineseYuan = 6.832;
const double canadianDollar = 1.1137;
const double cubanPeso = 1.0;
const double  ethiopianBirr = 9.09;
const double egyptianPound = 5.6275;
const double tunisianDinar = 1.3585;
const double thaiBaht = 34.4;

/****** 
I changed the variables to global variables so 
you don't have to worry about accidentally setting them
to 0 or assigning over a value that you need 
********/
float amtEchanged = 0.0;
char selection;
char yesNo;
double newAmount;

int main()
{
float amtExchanged = 0.0;
    selection = 'a';
    yesNo = 'y';
    newAmount = 0.0;

    getDollarAmt ();
    displayCurrencies();
    getCurrencySelection (amtExchanged);
    isSelectionValid(selection);/**** you only need to use the selection variable ****/
    calcExchangeAmt (amtExchanged, selection);
    displayResults(newAmount, amtExchanged, selection, yesNo);

    return 0;
}


double getDollarAmt (float amtExchanged)
// promt user for eachange amount and return it to main
{
    float amtExchanged0;//created temporary variable to set amtExchanged to

    cout<< "Please enter the total dollar amount to exchange:  ";
    cin>> amtExchanged0;


    amtExchanged = amtExchanged0;//setting amtExchanged to the right value
    return amtExchanged;
}


void displayCurrencies()
// display list of currencies
{
    cout<<"A    Russian Ruble"<<endl
        <<"B    North Korean Won"<<endl
        <<"C    Chinese Yuan"<<endl
        <<"D    Cuban Peso"<<endl
        <<"E    Ethiopian Birr"<<endl
        <<"F    Thai Baht"<<endl
        <<"G    Canadian Dollars"<<endl
        <<"H    Tunisian Dinar"<<endl
        <<"I    Egyptian Pound"<<endl;
}



char getCurrencySelection (float amtExchanged)
// make a selection and return to main
{
    char selection0;//again, created a temporary variable for selection

    cout<<"Please enter your selection:  ";
    cin>>selection0;


    selection = selection0;//setting the temporary variable to the actual variable you use

    /*****
    we are now going to see if isSelectionValid returns false.
    if it returns false, that means that their selection was not
    character A-H. if it is false we keep calling getCurrencySelection
    *****/
    if(isSelectionValid(selection)==false)
    {
        cout<<"Sorry, the selection you chose is invalid."<<endl;
        getCurrencySelection(amtExchanged);
    }


return selection;   
}


bool isSelectionValid(char selection) 
// this fuction is supposed to be called from getCurrencySelection, the selction
// must be sent to isSelectionValid to determine if its valid
// if selection is valid send it bac to getCurrencySelection
// if it is false then it is returned to getCurrencySelection and prompted to 
// make another selection until the selection is valid, then it is returned to main.
{
    /**** 
    i'm not sure if this is what you mean, 
    all i am doing is making sure 
    that their selection is A-H 
    *****/
    if(selection=='A' || selection=='B' || selection=='C' || selection=='D' || selection=='E' || selection=='F' || selection=='G' || selection=='H' || selection=='I')
        return true;
    else
        return false;   
}



double calcExchangeAmt (float amtExchanged,char selection)
// function calculates the amount of money to be exchanged
{

    switch (toupper(selection))
    {
    case 'A': newAmount =(russianRubles) * (amtExchanged);
        break;
    case 'B': newAmount = (northKoreanWon) * (amtExchanged);
        break;
    case 'C': newAmount = (chineseYuan) * (amtExchanged);
        break;
    case 'D': newAmount = (canadianDollar) * (amtExchanged);
        break;
    case 'E': newAmount = (cubanPeso) * (amtExchanged);
        break;
    case 'F': newAmount = (ethiopianBirr) * (amtExchanged);
        break;
    case 'G': newAmount = (egyptianPound) * (amtExchanged);
        break;
    case 'H': newAmount = (tunisianDinar) * (amtExchanged);
        break;
    case 'I': newAmount = (thaiBaht) * (amtExchanged);
        break;
    }
    return newAmount;
}


void displayResults(double newAmount, float amtExchanged, char selection, char yesNo)
// displays results and asked to repeat. IF they want to repeat it clears the screen and starts over.
{
    switch(toupper(selection))
    {
    case 'A': cout<<"$"<<amtExchanged<<" is "<<newAmount<<" Russian Rubles."<<endl<<endl;
        break;
    case 'B': cout<<"$"<<amtExchanged<<" is "<<newAmount<<" North Korean Won."<<endl<<endl;
        break;
    case 'C': cout<<"$"<<amtExchanged<<" is "<<newAmount<<" Chinese Yuan."<<endl<<endl;
        break;
    case 'D': cout<<"$"<<amtExchanged<<" is "<<newAmount<<" Cuban Pesos."<<endl<<endl;
        break;
    case 'E': cout<<"$"<<amtExchanged<<" is "<<newAmount<<" Ethiopian Birr."<<endl<<endl;
        break;
    case 'F': cout<<"$"<<amtExchanged<<" is "<<newAmount<<" Thai Baht."<<endl<<endl;
        break;  
    case 'G': cout<<"$"<<amtExchanged<<" is "<<newAmount<<" Canadian Dollars."<<endl<<endl;
        break;
    case 'H': cout<<"$"<<amtExchanged<<" is "<<newAmount<<" Tunisian Dinar."<<endl<<endl;
        break;
    case 'I': cout<<"$"<<amtExchanged<<" is "<<newAmount<<" Egyptian Pound."<<endl<<endl;
        break;
    }

    cout<<"Do you wish to continue?  (Y for Yes / N for No)";
    cin>>yesNo;

    if(yesNo=='y' || yesNo=='Y')
    {
        getDollarAmt(); 
    }
    else
    {
        system("cls");
    }

}
+1  A: 

You've declared getDollarAmt as double getDollarAmt(); but defined it as double getDollarAmt(float amtExchanged);

Joe Gauterin
+5  A: 

You declare the function as:

double getDollarAmt();

and then define it as:

double getDollarAmt (float amtExchanged)

and then call it as:

getDollarAmt ();

C++ allows function overloading, so this is not a compilation error. However, at link time, the linker cannot find the version that does not take a parameter.

Also, in the function the line:

amtExchanged = amtExchanged0;

will not change amtExchanged in the calling code. If you wanted to do that you should have passed it by reference. However, I don't think you do want it to do that, because you also return the value.

And one last point, unless you have specific reasons to do otherwise, it's best to use doubles rather than floats - they are more precise and may even be faster!

anon
Thanks... so i fixed that but my program is still not working right.i made my program consistant with double getDollarAmt(float amtExchanged)when i run my program the dollar amount i put in never reads through the program.
@user You never do anything with the value that the function returns - to do that, you would want something like `double d = getDollarAmt();` and then do something with d.
anon
A: 

Neil and Joe already told you the problem, but I just overflew your program and found this line:

if(selection=='A' || selection=='B' || selection=='C' || ....)

Just in case you don't know: if you want to save yourself some time through less typing, you can use ASCII Code instead of the characters. So if you just want to make sure, if the user input ist between 'A' and 'H', the following if would also do the job:

if(selection >= 65 && selection <= 72)
cyphorious
Isak Savo
@cyphorious: But that would make your code less portable. If you do it, at least follow @Isak, which would make it work with all encodings were the letters are in a continuous range.
sbi
Yes, absolutely true.
cyphorious