aとbのdouble型の数字を読み込み、
2つの数字の和と差と積と商を関数を使ってやりたいのですがうまくできません。
何が間違っているのか教えてください。
#include<stdio.h>
#include<stdlib.h>
void calc(double a, double b, double *sum,double *sub,double *mul,double *div);
int main(void){
double *a,*b,sum,sub,mul,div;
printf("a=");
scanf("%f",&a);
a=(double *)malloc(sizeof(double));
printf("b=");
scanf("%f",&b);
b=(double *)malloc(sizeof(double));
calc(a,b,&sum,&sub,&mul,&div);
printf("sum=%f,sub=%f,mul=%f,div=%f\n",sum,sub,mul,div);
free(a);
free(b);
return 0;
}
void calc(double a, double b, double *sum,double *sub,double *mul,double *div){
*sum=a+b;
*sub=a-b;
*mul=a*b;
*div=a/b;
}
なぜ動かないのか。。。
Re:なぜ動かないのか。。。
①:mallocで領域を確保する前にaを使用しています。(当然ながらbに関する部分も同様です)
②:scanf("%f",&a)の部分ですが、double型の場合は【%lf】ではないでしょうか?あとaはポインタなので、この記述ではポインタのアドレスを渡す事になってしまいます。scanf("%lf", a)とするべきではないかと思います。(当然ながらbに関する部分も同様です)
③:calc(a,b,&sum,&sub,&mul,&div)の部分ですが、関数の宣言部では第1引数と第2引数はdouble型を実体で渡すように宣言されていますが、実際に渡されているのはポインタになっています。
②:scanf("%f",&a)の部分ですが、double型の場合は【%lf】ではないでしょうか?あとaはポインタなので、この記述ではポインタのアドレスを渡す事になってしまいます。scanf("%lf", a)とするべきではないかと思います。(当然ながらbに関する部分も同様です)
③:calc(a,b,&sum,&sub,&mul,&div)の部分ですが、関数の宣言部では第1引数と第2引数はdouble型を実体で渡すように宣言されていますが、実際に渡されているのはポインタになっています。
Re:なぜ動かないのか。。。
void calc(double a, double b, double *sum,double *sub,double *mul,double *div);
関数の宣言部での記述はこうなっていますね?引数部分を見てみると、aとbはdouble型の変数、sumとsubとmulとdivはdouble型のポインタとなっています。
次にmain関数の下記の部分を見て下さい。
double *a,*b,sum,sub,mul,div;
変数のaとbはdouble型のポインタとして、sumとsubとmulとdivはdouble型の変数として定義されています。
しかし、main関数内でcalc関数を呼び出す際の記述を見てみると…
calc(a,b,&sum,&sub,&mul,&div);
こうなっています。aとbはポインタですから、この記述ではaとbの実体ではなく、それぞれに割り当てられたアドレスを渡す事になってしまいます。
今回の場合は先に記述したとおり、渡すべきはaとbのアドレスではなく実体でなければけませんので、この部分を書き換える必要があります。
関数の宣言部での記述はこうなっていますね?引数部分を見てみると、aとbはdouble型の変数、sumとsubとmulとdivはdouble型のポインタとなっています。
次にmain関数の下記の部分を見て下さい。
double *a,*b,sum,sub,mul,div;
変数のaとbはdouble型のポインタとして、sumとsubとmulとdivはdouble型の変数として定義されています。
しかし、main関数内でcalc関数を呼び出す際の記述を見てみると…
calc(a,b,&sum,&sub,&mul,&div);
こうなっています。aとbはポインタですから、この記述ではaとbの実体ではなく、それぞれに割り当てられたアドレスを渡す事になってしまいます。
今回の場合は先に記述したとおり、渡すべきはaとbのアドレスではなく実体でなければけませんので、この部分を書き換える必要があります。