从函数返回一个值

时间:2013-10-03 18:42:52

标签: c arrays function

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

#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;
}

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

4 个答案:

答案 0 :(得分:2)

我在您的代码中发现了多个问题。

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

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);
    ...
}

答案 1 :(得分: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,函数的返回类型是double,但这将是一个错误,因为结果是double(但不是double)的数组。此外,通过返回结果,您将返回导致代码中出现未定义行为的本地对象的地址。

答案 2 :(得分:0)

因为你的函数的返回类型是double*results的类型为double,而results的类型指针为double,即double *,因此您无法从返回类型定义的函数返回指针为double

答案 3 :(得分:0)

该函数返回类型为double的单个值。值results是包含两个double值的数组。返回*results相当于返回results[0],即数组中的第一个元素。