2017-04-16 5 views
0

現在、3つのヴァイラブルを入力できるようにする関数を使用する必要があるアサイメントのプログラムを作成しています。私はこれらの変数を私の主な機能に戻すことができず、以前に尋ねられた他の同様の質問を見て、ポインタを使用しようとしましたが、それを動作させることができません。私の試みは以下の通りです:ポインタを使用してCの関数から複数の値を返す方法

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

//Function Header for positive values function 
double get_positive_value(double* topSpeed, double* year, double* 
horsepower); 

int main(void){ 

    int reRunProgram = 0; 

    while (reRunProgram==0) 
    { 
     //variable declarations 
     double tS; 
     double yR; 
     double hP; 
     int menuOption; 
     int menuOption2; 

     //menu 
     printf("1.Create Bugatti\n"); 
     printf("2.Display Bugatti\n");  
     printf("3.Exit\n"); 

     //user choice 
     scanf("%d", &menuOption); 

     //Create car  
     if (menuOption == 1) { 

      //run the get positive values function 
      get_positive_value (&tS, &yR, &hP); 

      printf("top speed is %lf\n", tS); 
     } 

     //Display car (but no car created) 
     else if (menuOption == 2){ 
      printf("error no car created\n"); 
     } 

     //Exit 
     else if (menuOption ==3){ 
      exit(EXIT_FAILURE); 
     } 

    } 
    return 0; 
} 


double get_positive_value(double* topSpeed, double* year, double* 
horsepower) 
{ 
    do { 
     printf("Please enter the top speed of the bugatti in km/h\n"); 
     scanf("%lf", &topSpeed); 
    } while(*topSpeed<=0); 

    do{ 
     printf("Please enter the year of the bugatti, in four digit form (e.g. 1999)\n"); 
     scanf("%lf", &year); 
    } while(*year<=0); 

    do{ 
     printf("Please enter the horsepower of the bugatti\n"); 
     scanf("%lf", &horsepower); 
    } while(*horsepower<=0); 
} 
+1

CまたはC++?あなたはこの質問をC++とタグ付けしましたが、タイトルに「in C」と書いたのですか? – Rakete1111

+0

タグを入力する際に​​エラーが発生していたことをお詫び申し上げます。これはCです(私は正しく編集されています) –

+0

コードはコンパイルされません。 –

答えて

2

あなたがstructでそれらをラップしない限り、あなたは関数から複数の値を返すことはできません。ポインタに関しては、mainから関数に渡した値を変更することができます。

scanf("%lf", &topSpeed); 

topSpeedは、二重へのポインタで、あなただけがメイン(ポインタ変数のないアドレス)から渡された変数のアドレスを渡す必要がありますので:私はあなたがここで間違ってそれをやっていると思います。代わりに、次の操作を行う必要があります。

do { 
    printf("Please enter the top speed of the bugatti in km/h\n"); 
    scanf("%lf", topSpeed); 
} while(*topSpeed<=0); 
do { 
    printf("Please enter the year of the bugatti, in four digit form (e.g. 1999)\n"); 
    scanf("%lf", year); 
} while(*year<=0); 
do { 
    printf("Please enter the horsepower of the bugatti\n"); 
    scanf("%lf", horsepower); 
} while(*horsepower<=0); 

これが役立ちます。

1

あなたはmain関数内の変数tSyR & hPを宣言し、get_positive_value()関数への参照によってそれらを通過しました。

したがって、のアドレスの変数が渡されています。変数自体ではありません。 get_positive_value()

、あなたは、変数のアドレスを指定したが、代わりにアドレスのアドレスを与えたはずscanf()を使用して3つの変数の中にいくつかの値を配置しようとしています。 &topSpeedget_positive_value()とすると、&(&tS)main()となる。

あなたが参照することによって、それらを通過してきたので、get_positive_value()に、あなたはtSyRtopSpeedhPyearhorsepowerのアドレスを持っているそれぞれ。

topSpeed自体はtSのアドレスです。 Not &topSpeed

あなたはmain()に変数tSのアドレスを持っている
scanf("%lf", &topSpeed);
topSpeedので、(同様に、他の2つの変数のための) scanf("%lf", topSpeed);


に変更する必要があります。したがって、&topSpeedと言う場合は、「address of address of tS」にアクセスしようとしています。

0

あなたはこのポインタが指しているメモリアドレスに、値を求めている *someptrを行うと。

あなたがscanfを行うと、あなたが変数に&xを使用するときは、メモリアドレスことで値を保存したいので、あなたがそれを行います。したがって、scanfにポインタを指定した場合は、アドレスの代わりに値を渡して値を格納するため、*は使用しません。

実際に変更するポインタの代わりにポインタのメモリアドレスを渡すので、&を使用しないでください。これがあなたの主なエラーです。 最後に、これらの値をすべてstructを使用して一度にreturnにすることができますが、ポインタはよりエレガントです。

私はあなたを助け、私ははっきりしていました。

関連する問題