C功能无法正常工作

时间:2016-06-13 00:03:34

标签: 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;
}

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:2)

sum_diff()没有副作用。 s3, s4, d3, d4是所有局部变量。也就是说,s3中的main()s3中的sum_diff()两个不同的变量

你正在寻找更像的东西:

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][wlynch@watermelon /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.

答案 2 :(得分:0)

(这是其他答案中提供的内容的附加信息)

很难读懂,有一个函数需要8个指针,其中一些是入站的,有些是出站的。

首先,您不应该使用指针参数来传递不会被更改的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; } 。指针参数的使用要么是函数可以改变值,要么是当你不信任编译器有效地传递大值时作为手动优化。

其次,该函数执行两个单独的任务。最好有两个独立的功能。此外,最好使用返回值作为返回信息,这比使用out-parameter更容易阅读和更惯用。

所以代码可能是,使用C的原生复数支持:

return

如果您不想使用该原生支持(例如出于学习原因),那么我建议使用包含2个成员的结构来表示复数,以便您可以{{1}}。< / p>

相关问题