2016-09-21 9 views
-2

私は入力を受け取る関数と加速を計算する関数の2つを記述しようとしています。コンパイラは私の変数が初期化されていないが、入力からの値を持つべきであると私に伝えています。私は間違って何をしています。初期化されていない変数

#include <stdio.h> 
#include <stdlib.h> 

void input_instructions(double vi, double vf); 
double compute_acceleration(double vi, double vf); 

int main() 
{ 
    double vi; 
    double vf; 
    double acc; 
    double t; 


    input_instructions(vi, vf); 

    acc = compute_acceleration(vi,vf); 

    t = (vf - vi)/acc; 

    printf("The constant acceleration of the cyclist is %.2f and it will take him %.2f minutes/seconds/" 
      "to come to rest with an initial velocity of 10mi/hr.\n", acc, t); 
} 

void input_instructions(double vi, double vf) 
{ 
    printf("This program will calculate the rate of accleration and the time it takes/" 
      "the cyclist to come to rest\n"); 
    printf("Enter inital velocity=>"); 
    scanf("%lf", &vi); 
    printf("Enter final velocity"); 
    scanf("%lf", &vf); 
} 

double compute_acceleration(double vi, double vf) 
{ 
    double t = 1; 
    double a = (vf-vi)/t; 
    return (a); 
} 
+0

これはCでの関数の動作ではありません。おそらくhttps://stackoverflow.com/documentation/c/1006/function-parametersを試してみてください。 –

+0

あなたはちょっと気味が悪いようです。あなたはCクラスのどの部分にいるのですか?ポインタと参照渡しが何であるか知っていますか? –

+0

私は無知です。私たちはまだ合格点と指針について学んでいない。 –

答えて

3

うわー、ここでは多くの不具合が起こっています。 main()で宣言されている初期化されていない変数以外(Cコンパイラは正しい)、Cはパラメータを値渡しします。 viとvfのパラメータがスタックに格納されます。 scanfはそのスタック変数のアドレスを取得し、値を代入し、関数が戻り、割り当てられた値はなくなります。このような

void input_instructions(double *vi, double *vf) 
    { 
     printf("This program will calculate the rate of accleration and the time it takes/" 
       "the cyclist to come to rest\n"); 
     printf("Enter inital velocity=>"); 
     scanf("%lf", vi); 
     printf("Enter final velocity"); 
     scanf("%lf", vf); 

と(メインからの呼び出し):

あなたはこのように、あなたの変数へのポインタを渡したい
void input_instructions(double vi, double vf) 
{ 
    printf("Enter inital velocity=>"); 
    scanf("%lf", &vi); 
    printf("Enter final velocity"); 
    scanf("%lf", &vf); 

    // function returns and input parameter values are gone. 
} 

input_instructions(&vi, &vf); 

examplesを参照してください。

+0

私はこのようにしません。 –

0

vi、vf、accおよびtをグローバル変数(メイン変数外)として宣言します。

#include <stdio.h> 
#include <stdlib.h> 

void input_instructions(); 
double compute_acceleration(); 
double vi; 
double vf; 
double acc; 
double t; 
int main() 
{ 



    input_instructions(); 

    acc = compute_acceleration(); 

    t = (vf - vi)/acc; 

    printf("The constant acceleration of the cyclist is %.2f and it will take him %.2f minutes/seconds/" 
      "to come to rest with an initial velocity of 10mi/hr.\n", acc, t); 
} 

void input_instructions() 
{ 
    printf("This program will calculate the rate of accleration and the time it takes/" 
      "the cyclist to come to rest\n"); 
    printf("Enter inital velocity=>"); 
    scanf("%lf", &vi); 
    printf("Enter final velocity"); 
    scanf("%lf", &vf); 
} 

double compute_acceleration() 
{ 
    double t = 1; 
    double a = (vf-vi)/t; 
    return (a); 
} 

また、ポインタを使用して 'input_instructions'関数に渡すこともできます。

+0

これがなぜ投票されなかったのか分かりません。私は、グローバル変数解決策が教授がこのケースで探していたものであると思う。 –

1

input_instructions関数の変数を読み込んで「渡す」ことができません。そして、彼らの記憶は機能の中でスピンアップされているので、彼らの外にアクセスすることはできません。

変数viとvfをグローバル変数に変更するには、mainの外でそれらを宣言し、input_functionsのシグネチャでそれらを持つようにしてください。残りはうまくいくでしょう。この場合

#include <stdio.h> 
#include <stdlib.h> 

/* Prototypes */ 
void input_instructions(); 
double compute_acceleration(double new_vi, double new_vf); 

/* Globals */ 
double vi; 
double vf; 

int main() 
{ 

あなたの周りのグローバルを渡していることから、あなたも、必ずしもどちらかcompute_acceleration機能のパラメータを受け入れるする必要はありません。私は通常、グローバルをお勧めしませんが、それはあなたが扱っている問題の中で最も少ないようです。

もう1つの方法は、mainの変数viとvfを0に初期化し、それらの値を関数によって変更できるようにinput_instructionsに参照渡しすることです。

例えば

:私は、変数のメモリ位置が存在し、あなたの例では、メインでviは、実際のviよりも別の変数がどのように見せる理解するために、変数の名前を変更しました

void input_instructions(double *i, double *f); 
double compute_acceleration(double x, double y); 


int main() 
{ 
    double vi = 0; 
    double vf = 0; 
    double acc = 0; 
    double t = 0; 


    input_instructions(&vi, &vf); 
    acc = compute_acceleration(vi,vf); 

呼び出されたメソッドの内部。 vfあるvi

+0

メイン関数内の2つの関数の変数を互いにローカルにするにはどうすればよいですか? –

+0

関数はスタック上でのみ使用できる独自の変数をスピンアップします。それらは他の関数では利用できず、関数が終了するとすぐにスタックからクリーンアップされます。 mainによって呼び出される関数は、mainからの変数にもアクセスしません。私が与えた最初の解決策は、ローカル変数ではなくグローバルである。グローバル変数は、スタック全体ではなくヒープ上に作成されるため、ソリューション全体でアクセス可能です。 –

+0

2番目の解決策は、参照渡しを使用します。新しい変数は、mainによって呼び出された関数の中でまだスピンアップされていますが、mainの値のスタック上のメモリ位置を(パラメータを介して)渡します。これにより、スタックの部分に影響を与える変更を加えることができます。通常はにアクセスできます。 –

0

void input_instructions(double vi, double vf) 
{ 
. 
. 
} 
の変数は、関数に対してローカルであり、 main()機能に類似した名前の変数にはベアリングを有していません。言い換えれば、彼らは function-scopeを持っていて、関数が返った後にそれらは存在しなくなります。あなたが行ってきたはずです何

は次のとおりです。

input_instructions(&vi,&vf); // pass the address in the main() 

と機能を書き換えるよう:永続的な変更は仮引数を使用してmain()vfviに作られています。ここ

void input_instructions(double *vi, double *vf) // Using pointers 
{ 
    printf("This program will calculate the rate of accleration and the time it takes/" 
      "the cyclist to come to rest\n"); 
    printf("Enter inital velocity=>"); 
    scanf("%lf", vi); // Hmm, you're changing the value in the main() 
    printf("Enter final velocity"); 
    scanf("%lf", vf); // Note no '&' since we're dealing with pointers. 
} 

機能input_instructions*vfおよび*vi

関連する問題