1

我想问一个关于从函数返回值的新手问题,这是我的简单程序:

#include <stdio.h>
double calcule(double r1,double r2, double r3)
{
    double serie;
    double parallele;

    serie = r1 + r2 + r3;
    parallele = (r1*r2*r3)/(r1*r2+r1*r3+r2*r3);
    double results[2] = {serie,parallele};
    return *results;
}
int main()
{
    double r1;
    double r2;
    double r3;
    printf("Veuillez entrez les valeurs R1,R2 et R3");
    scanf("%lf",&r1);
    scanf("%lf",&r2);
    scanf("%lf",&r3);
    double res[1] = {calcule(r1,r2,r3)};
    printf("Si les resistances sont branchées en série la resistance equivalente est : %f",res[0]);
    printf("Si les resistances sont branchés en parallele la resistance equivalente est : %f",res[1]);
    return 0;
}

我的问题是为什么我必须做“return *results;” 而不是仅仅做“返回结果”;?

4

4 回答 4

2

我在您的代码中看到了多个问题。

a) 在函数计算中声明的数组变量“结果”的范围仅限于函数本身。一旦程序完成执行语句块(函数),结果指向的变量位置不再有效。尝试访问其范围后的结果指向的位置有时会导致访问冲突错误。

b)您在令您满意的位置声明变量。您的代码可以使用 C99 std 很好地编译,但在使用 c89 和 c90 编译时会受到影响。为了可移植性,最好在块的开头执行所有类型声明语句。

#include "stdio.h" 
double calcule(double r1,double r2, double r3) {
    double serie;
    double parallele;    
    serie = r1 + r2 + r3;
    parallele = (r1*r2*r3)/(r1*r2+r1*r3+r2*r3);
    double results[2] = {serie,parallele};     /* a) scope is restricted to this block */
    return *results; 
}

int main() {
    double r1;
    double r2;
    double r3;
    printf("Veuillez entrez les valeurs R1,R2 et R3");
    scanf("%lf",&r1);
    scanf("%lf",&r2);
    scanf("%lf",&r3);
    double res[1] = {calcule(r1,r2,r3)}; /* b) type declaration not allowed here in c89/c90 */
    printf("Si les resistances sont branchées en série la resistance equivalente est : %f",res[0]);
    printf("Si les resistances sont branchés en parallele la resistance equivalente est : %f",res[1]);
    return 0; 
}

我会给你函数原型,而不是我编写代码。您可以使用它们来构建您的功能。

void calcule(double r1, double r2, double r3, double *output);
int main (void){
    ...
    double output[2];
    calcule(r1,r2,r3,output);
    ...
}
于 2013-10-04T07:47:12.203 回答
1

*result是 ==return[0]所以:

return *results;

是:

return results[0];

这相当于:

return serie;

serie是结果数组中的第 0 个元素。

我对您的代码了解不多,但您的calcule()函数正在做什么有用的只是相当于

double calcule(double r1,double r2, double r3)
{
    return r1 + r2 + r3; // because serie = r1 + r2 + r3;
}

因为所有其他变量都是局部变量。

注意:虽然你的函数的返回类型是双精度,但如果你返回result它会是一个错误,因为结果是一个双精度数组(但不是双精度)。此外,通过返回结果,您将返回导致代码中未定义行为的本地对象的地址。

于 2013-10-03T18:45:11.087 回答
1

该函数返回一个 type 的值double。该值results是一个包含两个值的数组double。Returning*results等价于返回results[0]数组中的第一个元素。

于 2013-10-03T18:45:20.667 回答
0

因为你的函数的返回类型是double. *resultsis 类型doublewhileresults是指向 double 类型的指针,即 ,double *因此您不能从返回类型定义为 的函数返回指针double

于 2013-10-03T18:44:49.523 回答