2016-04-15 3 views
0

Я получаю ошибку неинициализированной локальной переменной calculateTax, я попытался определить ее с помощью int, и это не сработало, я беспокоюсь, если я добавлю что-то вроде int calculateTax = 0, он переопределит функция, которую я создал для переменной.неинициализированная локальная переменная calculateTax используется

Я всего нуб, когда дело доходит до программирования, так что я надеюсь, что есть что-то очевидно, мне не хватает, любая помощь будет наиболее ценится

Вот код:

//Gross pay calculation 
    //additional tax rate calculation 
    #include <iostream> 
    #include <iomanip> 
    using namespace std; 

    //Setting global contants 
    const double PAY_RATE = 22.55; 
    const double BASE_HOURS = 40.0; 
    const double OT_MULTIPLIER = 1.5; 

    //Prototype functions 
    double getBasePay (double); 
    double getOvertimePay(double); 
    double getCalculateTax(double); 

    int taxRate; 


    int main() 
    { 
     double hours, 
     basePay, 
     overtime = 0.0, 
     taxRate, 
     taxOwed, 
     calculateTax, 
     totalPay; 


     //Input hours worked 
     cout << "How many hours did you work? "; 
     cin >> hours; 

     //Input Tax rate 
     cout << "What is the percent of your tax rate? "; 
     cin >> taxRate; 

     //get base pay 
     basePay = getBasePay(hours); 

     //Get OT if applicable 

     if (hours > BASE_HOURS) 
      overtime = getOvertimePay(hours); 

     //calculate total pay 
     totalPay = basePay + overtime; 

     //calculate Tax rate 
    taxOwed = calculateTax; 

    // Setting output format 
    cout << setprecision(2) << fixed << showpoint; 

    //Display calculated pay 
    cout << "Base pay: $" << basePay << endl 
     << "Overtime pay: $" << overtime << endl 
     << "Total pay: $" << totalPay << endl 
     << "Taxes owed: $" << taxOwed << endl; 

    //Adding Pause before creating functions 
    char c; 
    cout << "Press any key to end program: "; 
    cin >> c; 
    return 0; 
} 

//############################################# 
// Get base pay function accepts hours worked # 
// and returns pay for non OT hours   # 
//############################################# 

double getBasePay(double hoursWorked) 
{ 
    double basePay; 

    // determine base pay 
    if (hoursWorked > BASE_HOURS) 
     basePay = BASE_HOURS * PAY_RATE; 
    else 
     basePay = hoursWorked * PAY_RATE; 

    return basePay; 
} 

//############################################## 
// The get overtime function accepts hours  # 
//then returns the OT pay if applicable  # 
//############################################## 

double getOvertimePay(double hoursWorked) 

{ 
    double overtimePay; 

    //Determine OT pay 
    if (hoursWorked > BASE_HOURS) 
    { 
     overtimePay = (hoursWorked - BASE_HOURS) * 
      PAY_RATE * OT_MULTIPLIER; 
    } 
    else 
     overtimePay = 0.0; 

    return overtimePay; 
} 
//########################################## 
//this taxes function calculates tax owed # 
// based on the total pay regardless of OT # 
//########################################## 

double getCalculateTax(double totalPay) 
{ 
    double calculateTax; 

    calculateTax = (taxRate/100) * totalPay; 

    return calculateTax; 
} 
+2

'главный()' 'определяет двойную calculateTax' (т.е. неинициализированные) и Безразлично 't назначать ему перед 'taxOwed = calculateTax;'. Это * неопределенное поведение *. Нет связи между переменной 'main()' и переменной с одинаковым именем внутри 'getCalculateTax'.Удалите 'calculateTax' из длинного списка переменных atop' main() ', и как только вы знаете' totalPay', вы можете сказать 'double calculateTax = getCalculateTax (totalPay);' поэтому он немедленно инициализируется. –

ответ

1

У вас есть ясный случай undefinded Behavior. Вы используете унифицированную переменную calculateTax в своем main(). Если переменная не инициализирована, она хранит необработанные биты, которые находились в пространстве памяти, где хранится ваша переменная. Затем эти биты будут интерпретироваться как тип, который вы указали в качестве переменной, например. double в вашем случае. Вам может повезти, и этот кусок памяти содержит только 0, поэтому ваша переменная будет содержать значение 0, однако, если бит установлен в 1, ваша переменная будет иметь совершенно другое значение. Понял?

Поэтому самое лучшее, что вы можете сделать, - это всегда инициализировать все ваши переменные сразу после их объявления. Таким образом, вместо

double hours, 
    basePay, 
    overtime = 0.0, 
    ... ; 

Сделайте себе одолжение и записать его как то

double hours = 0; 
double basePay = 0; 
double overtime = 0.0; 
    ... 

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

Таким образом, вместо присвоения неинициализированный переменной вы, вероятно, хотели сделать что-то вроде этого:

taxOwed = getCalculateTax(totalPay); 

Это должно сделать работу;)

+0

Спасибо! Я смог его запустить и запустить. – Ben

1

calculateTax следует принимать 2 аргументы:

double getCalculateTax(double totalPay, double taxRate) 
{ 
    double calculateTax; 

    calculateTax = (taxRate/100) * totalPay; 

    return calculateTax; 
} 

, так, звонок:

taxOwed = calculateTax(totalPay, taxRate); 

удалить if из вызова

//  if (hours > BASE_HOURS) // getOvertimePay() already checks if hours>base 
      overtime = getOvertimePay(hours); 

и что должно быть.

ПРИМЕЧАНИЯ: старайтесь избегать объявления нескольких варов в строке. Объявить их, когда и где вы нуждаетесь в них:

double overtime = getOvertimePay(hours); 
double totalPay = basePay + overtime; 
double taxOwed = calculateTax(...); 

и вы можете очистить ваши функции немного:

double getBasePay(double hoursWorked) { 
    return (hoursWorked > BASE_HOURS ? BASE_HOURS : hoursWorked) * PAY_RATE; 
    // return min(BASE_HOURS, hoursWorked)*PAY_RATE 
} 

double getOvertimePay(double hoursWorked) { 
    return (hoursWorked > BASE_HOURS ? hoursWorked - BASE_HOURS : 0) * 
      PAY_RATE * OT_MULTIPLIER; 
} 

double getCalculateTax(double totalPay, double taxRate) { 
    return (taxRate/100) * totalPay; // are you sure about that "/100"? usually doubles [0..1] are used for percentages 
} 
Смежные вопросы