構造体を用いて有理数型の掛け算をする関数mula、最大公約数を求める関数gcdを用いて、有理数型掛け算の結果を約分して返すプログラムを作成したのですが、実行するとsegmentation faultになってしまいます。
html
1#include<stdio.h> 2#include<stdlib.h> 3 4typedef struct { 5 int n, d; 6} rational; 7 8int gcd ( int a, int b ) 9{if(a == b){ 10 return a;} 11 else if(a > b){ 12 return gcd(a-b,a);} 13 else { 14 return gcd(a,b-a);} 15} 16rational setr(int n, int d) 17{ 18 rational z; 19 if (d == 0) { 20 fprintf(stderr, "Denominator must be nonzero.\n"); 21 exit(1); 22 } 23 z.n = n; 24 z.d = d; 25 return z; 26} 27 28void printr(rational z) 29{ 30 printf("%d/%d\n", z.n, z.d); 31} 32 33rational mulr(rational x, rational y) 34{ 35 int n = x.n * y.n; 36 int d = x.d * y.d; 37 int k = gcd(n,d); 38 rational z = setr(n/k, d/k); 39 return z; 40} 41 42void check4(int argc, char *argv[]) 43{ 44 rational x, y; 45 { 46 int a = atoi(argv[1]); 47 int b = atoi(argv[2]); 48 int c = atoi(argv[3]); 49 int d = atoi(argv[4]); 50 x = setr(a, b); 51 y = setr(c, d); 52 } 53 { 54 // mulr 55 rational z = mulr(x, y); 56 printr(z); 57 } 58 } 59int main(int argc, char *argv[]) 60{ 61 check4(argc, argv); 62 return 0; 63}
約分を考えない際には上手くいったので
int k = gcd(n,d); rational z = setr(n/k, d/k);
の箇所が間違っていると思います。しかしどう全体を訂正すれば良いのかわかりません。
よろしくお願いします。
どのような値を入れたらその現象が発生するのでしょうか。
また、どこまで実行出来ていてその時の変数の値はどうなっているのかをお調べになったでしょうか。
どの値でも駄目でした。
最大公約数kで分母分子を割るという考えは間違っていないと思います。
kで割らない場合はどの値でも成功しました。
> どの値でも駄目でした。
4 つの int 型を基に動作するプログラムの場合、int が 32bit として数の組み合わせは約 43 憶の 4 乗個存在します。
その全てで駄目だったのでしょうか。
プログラムの動作に対しましては推測で範囲を限定(もしくは拡張)しないほうが良いと思います。
例えば全部 0 を指定しても発生するのでしょうか。
発生するとすれば、setr 関数の if 文内で exit するまでの間に問題があることになります。
全部 1 では? 全部 -1 では?
正数・ゼロ・負数の組み合わせや約分が発生する場合・しない場合等でいくつかのテストパターンを作り、それぞれでどう動作するはずか、そして実際にはどう動作しているかを一つ一つ確認することで、バグを探し出せます。
有難うございます。
やってみます。
回答3件
あなたの回答
tips
プレビュー