2010-06-01 1 views
0

Ошибки я получаю являются:Я получаю фатальные ошибки ... может ли кто-нибудь помочь мне изменить мою программу?

Ошибка 1 Ошибка LNK2019: неразрешенный внешний символ "двойной __cdecl getDollarAmt (аннулируются)" (getDollarAmt @@ YANXZ?) Ссылается функция _Главная hid.obj Ошибка 2 фатальным LNK1120 ошибка: 1 неразрешенных внешних

это моя программа:

#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 function is supposed to be called from getCurrencySelection, the selection 
// must be sent to isSelectionValid to determine if its valid 
// if selection is valid send it back 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"); 
    } 

} 
+2

Почему downvote - это не хуже, чем многие, многие другие вопросы здесь, и, по крайней мере, опубликовать реальный код. – 2010-06-01 08:04:45

+0

Ваш комментарий относительно глобалов кажется странным. Причина, по которой глобальные взгляды не одобряются, заключается в том, что вам нужно больше обойтись о них, поскольку любая функция, вызываемая в любое время, имеет доступ к ним и может изменить их прямо под вашим носом. Избегайте глобальных изменений, и в конечном итоге вам будет не о чем беспокоиться. – sbi

+0

@anon I downvoted, потому что этот вопрос задается довольно много раз * каждый день * и есть один * очень * хороший вопрос и ответ, относящийся к нему, который относится к 2009 году. – cybermonkey

ответ

1

Вы объявили getDollarAmt, как double getDollarAmt(); но определил его как double getDollarAmt(float amtExchanged);

6

Вы объявляете функцию как:

double getDollarAmt(); 

, а затем определить его как:

double getDollarAmt (float amtExchanged) 

, а затем вызвать его как:

getDollarAmt(); 

C++ допускает перегрузку функций, так что это не является сбор ошибка. Однако во время соединения компоновщик не может найти версию, которая не принимает параметр.

Кроме того, в функции линии:

amtExchanged = amtExchanged0; 

не изменится amtExchanged в коде вызова. Если вы хотите сделать это, вы должны были передать его по ссылке. Однако я не думаю, что вы этого хотите, потому что вы также возвращаете значение.

И один последний момент, если у вас нет особых причин для этого, лучше использовать двойники, а не плавать - они точнее и даже быстрее!

+0

Спасибо ... так что я исправил это, но моя программа все еще не работает. я сделал свою программу последовательны с двойной getDollarAmt (флоат amtExchanged) , когда я запускаю свою программу сумма в долларах я не положил в никогда не читает программу. – user350217

+0

@user Вы никогда ничего не делаете со значением, возвращаемым функцией - для этого вам нужно что-то вроде 'double d = getDollarAmt();' и затем делать что-то с d. – 2010-06-01 08:21:00

0

Нил и Джо уже сказал вам эту проблему, но я просто облет вашу программу и нашел эту строку:

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

Только в случае, если вы не знаете: если вы хотите, чтобы сэкономить время с помощью менее вы можете использовать код ASCII вместо символов. Так что, если вы просто хотите, чтобы убедиться, если пользовательский ввод IST между «A» и «H», следующее, если и не будет делать работу:

if(selection >= 65 && selection <= 72) 
+2

или даже 'if (selection> = 'A' && selection <= 'I')' –

+0

Но это сделает ваш код менее портативным. Если вы это сделаете, по крайней мере, следуйте @Isak, который заставит его работать со всеми кодировками, были буквы в непрерывном диапазоне. – sbi

+0

Да, абсолютно верно. – cyphorious