2016-06-13 5 views
0

2つの複素数の和と差を計算することはできません。C関数が正しく機能しない

#include <stdio.h> 

void sum_diff(double *r3, double *i3, double *r4, double *i4); 

int main() 
{ 
    double r3, i3, r4, i4, s3, s4, d3, d4; 

    printf("Enter r3 and i3 where r3 + i3 is the first complex number.\n"); 
    printf("r3 = "); 
    scanf("%lf", &r3); 

    printf("i3 = "); 
    scanf("%lf", &i3); 

    printf("Enter r4 and i4 where r4 + i4 is the second complex number.\n"); 
    printf("r4 = "); 
    scanf("%lf", &r4); 

    printf("i4 = "); 
    scanf("%lf", &i4); 

    sum_diff(&r3, &i3, &r4, &i4); 

    printf("The sum of the two complex numbers = %.3lf + %.3lf\n.", s3, s4); 
    printf("The difference of the two complex numbers = %.3lf - %.3lf\n.", d3, d4); 

    return 0; 
} 
void sum_diff(double *r3, double *i3, double *r4, double *i4) 
{ 
    double s3, s4, d3, d4; 

    s3 = *r3 + *r4; 
    s4 = *i3 + *i4; 
    d3 = *r3 - *r4; 
    d4 = *i3 - *i4; 
} 
+1

「作業していない」、またはエラーが表示された場合は、ご記入ください。コンパイルエラーが発生していると推測します。 – TenG

+0

曖昧な説明をお詫び申し上げます。つまり、基本的にはCodeBlocksで実行し、複素数を入力するように促します。合計と差は計算されていません。それは私に "2つの複素数の合計= 0.000 + 0.000です。"私の参照がvoid関数で正しくないので、それはありますか? – lg713

+1

あなたは実際には和と差を計算しています...あなたはそれらを使って何もしていないか、main()に戻しているだけです。'sum_diff()'の 's3'、' s4'などは、 'main()'と同じ変数ではありません。その関数の各呼び出し、実際に)。 – Dmitri

答えて

4

問題は変数の範囲にあります。あなたの関数を変更し :

void sum_diff(double *r3, double *i3, double *r4, double *i4, 
       double *s3, double *s4, double *d3, double *d4) 
{ 
    *s3 = *r3 + *r4; 
    *s4 = *i3 + *i4; 
    *d3 = *r3 - *r4; 
    *d4 = *i3 - *i4; 
} 

そしてとしてそれを呼び出す:(これは他の回答で提供されるものへの追加情報です)

sum_diff(&r3, &i3, &r4, &i4, &s3, &s4, &d3, &d4); 
+0

@Midas編集していただきありがとうございます。それは有り難いです! – sg7

+0

歓迎します:-) – Midas

2

sum_diff()副作用を持ちません。 s3, s4, d3, d4はすべてローカル変数です。すなわち、s3main()s3sum_diff()は、の2つの異なる変数です。

あなたはより多くのような何かを探している:

void sum_diff(double r3, double i3, double r4, double i4, 
       double *s3, double *s4, double *d3, double *d4) 
{ 
    *s3 = r3 + r4; 
    *s4 = i3 + i4; 
    *d3 = r3 - r4; 
    *d4 = i3 - i4; 
} 

そして、あなたはこれを呼び出します。

さらに
sum_diff(r3, i3, r4, i4, &s3, &s4, &d3, &d4); 

、私は強く/あなたのコンパイラの警告に耳を傾けるのいくつかの組み合わせをお勧めします警告レベルを含めるためにコンパイラをアップグレードする/フラグを使用する。与えられたあなたのコードは私のために次のものを生成します:

[5:18pm][[email protected] /tmp] gcc -Wall blah.c 
blah.c:25:69: warning: variable 's3' is uninitialized when used here [-Wuninitialized] 
    printf("The sum of the two complex numbers = %.3lf + %.3lf\n.", s3, s4); 
                    ^~ 
blah.c:25:73: warning: variable 's4' is uninitialized when used here [-Wuninitialized] 
    printf("The sum of the two complex numbers = %.3lf + %.3lf\n.", s3, s4); 
                     ^~ 
blah.c:26:76: warning: variable 'd3' is uninitialized when used here [-Wuninitialized] 
    printf("The difference of the two complex numbers = %.3lf - %.3lf\n.", d3, d4); 
                      ^~ 
blah.c:26:80: warning: variable 'd4' is uninitialized when used here [-Wuninitialized] 
    printf("The difference of the two complex numbers = %.3lf - %.3lf\n.", d3, d4); 
                       ^~ 
4 warnings generated. 
0

読みするのは非常に難しいです8つのポインタを取る機能を持ち、そのうちのいくつかはインバウンドであり、いくつかはアウトバウンドである。

まず、変更しないdoubleを渡すためのポインタパラメータを使用しないでください。ポインタパラメータの使用は、関数が値を変更できるようにするか、効率的に大きな値を渡すようにコンパイラを信頼しない場合は手の最適化として使用します。

第2に、この機能は2つの別々のタスクを実行します。 2つの別々の機能を持つ方が良いでしょう。また、返される情報の戻り値を使用するほうがよいでしょう。これは、outパラメータを使用するよりも読みやすく、より慣用的です。

だからコードは、Cのネイティブ複素数のサポートを使用して、次のようになります。

complex double my_csum(complex double a, complex double b) 
{ 
    return a + b; 
} 

complex double my_cdiff(complex double a, complex double b) 
{ 
    return a - b; 
} 

あなたはネイティブサポート(学習上の理由など)が、私は2と構造体を使用することをお勧めしますことを使用したくない場合複雑な数を表すメンバーはreturnです。

関連する問題