なぜ動かないのか。。。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
カピバラ

なぜ動かないのか。。。

#1

投稿記事 by カピバラ » 17年前

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:なぜ動かないのか。。。

#2

投稿記事 by バグ » 17年前

①:mallocで領域を確保する前にaを使用しています。(当然ながらbに関する部分も同様です)

②:scanf("%f",&a)の部分ですが、double型の場合は【%lf】ではないでしょうか?あとaはポインタなので、この記述ではポインタのアドレスを渡す事になってしまいます。scanf("%lf", a)とするべきではないかと思います。(当然ながらbに関する部分も同様です)

③:calc(a,b,&sum,&sub,&mul,&div)の部分ですが、関数の宣言部では第1引数と第2引数はdouble型を実体で渡すように宣言されていますが、実際に渡されているのはポインタになっています。

カピバラ

Re:なぜ動かないのか。。。

#3

投稿記事 by カピバラ » 17年前

回答ありがとうございます!!
①と②はわかったのですが③の部分をもう少し詳しく教えてください。

バグ

Re:なぜ動かないのか。。。

#4

投稿記事 by バグ » 17年前

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のアドレスではなく実体でなければけませんので、この部分を書き換える必要があります。

カピバラ

Re:なぜ動かないのか。。。

#5

投稿記事 by カピバラ » 17年前

わかりました!
ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る