2017-10-19 12 views
0

こんにちは私は学校のためのプロジェクトに取り組んでおり、私の人生のために働くtotalJobCost関数を取得する方法を理解できません。その他の機能は問題なく動作しますが、私は彼らがtotalJobCost出力、ここで0としてつかむためtotalJobCostのために戻ってメインにVARを渡しているとは思わない、私は使用していたコードです:あなたがする必要がPaint Job Estimator C++

#include "stdafx.h" 
#include <iostream> 

using namespace std; 

void space(double paintarea, double paintcost, double paintneeded, double totalpaint); 
void cost(double hrs, double hrcost, double spacetopaint); 
void totalJobCost(double allTheirPaintCost, double allTheirWages, double theirTotalJobCost); 


const double AREA_FORMULA = 220.00; 
const double AREAFORMULA_PAINT = 1.00; 
const double AREAFORMULA_HOURS = 8.00; 
const double AREAFORMULAHOURS_WAGES = 35.00; 

int main() 
{ 
    double areaTP; 
    double paintCST = 0; 
    double paintNeeded = 0; 
    double allPaintCost = 0; 
    double hoursNeeded = 0; 
    double hoursWages = 0; 
    double allWages = 0; 
    double allJobCost = 0; 

    cout << "Enter the square footage you need to paint, then press enter" << endl; 
    cin >> areaTP; 

    cout << "Enter the price by gallons of paint you will use, then press enter" << endl; 


    cin >> paintCST; 
    while (paintCST < 10) 
    { 
     cout << "Enter the price by gallons of paint you will use, then press enter. cannot be less than 10 :"; 
     cin >> paintCST; 
    } 

    space(areaTP, paintCST, paintNeeded, allPaintCost); 

    cost(hoursNeeded, hoursWages, areaTP); 


    totalJobCost(allPaintCost, hoursWages, allJobCost); 


    system("Pause"); 

    return 0; 
} 

void space(double paintarea, double paintcost, double paintneeded, double totalpaint) 
{ 

    paintneeded = paintarea/AREA_FORMULA * AREAFORMULA_PAINT; 
    totalpaint = paintneeded * paintcost; 

    cout << "How many gallons of paint you will need: " << paintneeded << endl; 
    cout << "Your total paint cost will be: " << totalpaint << endl; 
} 

void cost(double hrs, double hrcost, double spacetopaint) 
{ 

    hrs = (spacetopaint/AREA_FORMULA) * AREAFORMULA_HOURS; 
    hrcost = hrs * AREAFORMULAHOURS_WAGES; 

    cout << "The number of hours for the job will be: " << hrs << endl; 
    cout << "The total amount of wages will be: " << hrcost << endl; 

} 

void totalJobCost(double totalpaint, double hrcost, double theirTotalJobCost) 
{       
    theirTotalJobCost = totalpaint + hrcost; 

    cout << "The total price of your paint job will be: " << theirTotalJobCost << endl; 
} 

答えて

1

あなたの議論(totalpainthrcost)を参照として宣言してください。

現在、関数space()cost()は、呼び出されるとtotalpainthrcostのコピーを作成し、更新してから印刷します。しかし、関数が復帰すると、totalpainthrcostに格納された値は失われます。次のように

これを修正するには、あなたがこれらの機能を宣言する必要があります。

void space(double paintarea, double paintcost, double paintneeded, double& totalpaint) 

void cost(double hrs, double& hrcost, double spacetopaint) 

space()またはcost()はそれで動作するときにtotalpainthrcostとして渡すどんな変数今が更新されます。

+1

ありがとうございましたが、ダブル&ワークの仕組みを説明してください。それはちょうどこの値をどこでも変えると言うか、それが実行される関数の値を変更するだけですか?(例えば:main) –

+0

これは後者です:関数 'space()'は、例えば、 'allPaintCost'の値を( 'main()')で実行される関数です。 – frslm

+0

double&は、かなり一般的なので、私が下で与えたコード例を簡略化したものです。ポインタの再割り当てを許可しないなど、いくつかの安全機能が追加されています。 –

1

これは、値渡しのパスと参照渡しの問題の比較です。 C++で

参照とポインタながら、ブール、文字、整数、浮動小数点数、 配列、クラス、などの文字列、リスト、辞書、セット、スタック、 キュー-および列挙は、値型であります は参照型です。

CPP reference

使用している変数は、倍精度(倍精度浮動小数点)しているので、彼らは値型です。値型変数をパラメータとして関数に渡すと、変数の現在の値が呼び出した関数の呼び出しスタックにコピーされます。関数の内部に入ると、パラメータ名はコピーされた値にアクセスするために使用する名前に過ぎません。これらのコピーされた値に何をしても、関数に渡した元の変数の値には影響しません。 C/C++の関数スコープと呼び出しスタック構造を読んでもっと理解してください。

関数呼び出しで変数の値を変更するには、メモリ内のその場所への参照を渡す必要があります。関数の最初の数行に変数を宣言すると、メモリ内のその場所はその関数の呼び出しスタックの一部になり、元の関数内で呼び出された関数呼び出しでそのメモリに安全にアクセスできます。したがって、これを行うことができます:

int main() { 
    double variable = 0; 
    function(&variable); 
    cout << variable; 
} 

void function(double* variable_address) { 
    *variable_address = 1.5; 
} 

これは、逆参照演算子を含みます。申し訳ありませんが、これはあまりにも多くの情報ですが、参照渡しと値渡しは、C/C++の基礎となる関数呼び出しとメモリアーキテクチャで何が起こっているのかを理解すると分かりやすくなります。

+0

ありがとう、これは私が関数間の変数をもう少し理解する助けになりました。 –