为什么你跳过void函数调用而不捕获它们?

时间:2017-12-04 14:34:05

标签: c return function-call

我想调用一个计算圆的宽度的函数。

#include <stdio.h>
void area(double*);
int main()
{
    void* vp = NULL;
    double r;
    printf("input value : ");
    scanf(" %lf", &r);
    (double*)vp = &r;
    void area(vp);
}
void area(double* dp)
{
    double result;
    result = (*dp) * (*dp) * (3.14);
    printf("circle are is : %.2lf", result);
    return 1;
}*

我想调用// void area(vp)//中的函数,但我无法捕获visual stdio中的错误并按原样继续操作。你知道原因是什么吗?

3 个答案:

答案 0 :(得分:2)

调用该函数,您可以写area(vp); 而不是 void area(vp);

后者,因为它出现在函数main中,是一个函数原型,没有运行时效果。

并修正PI的定义:鉴于您使用的是double类型,因此非常不合适。见Math constant PI value in C

答案 1 :(得分:0)

你应该写

  area(&r);

而不是错误和多余的

 void area(vp);

添加你在语法

中犯下的明显错误
  • 我认为vp没有任何理由在那里。

  • 为确保scanf()成功,请务必检查通话的返回值。

  • 引用C11,章节§6.8.6.4,

      

    带有表达式的return语句不应出现在返回类型的函数中   是void。 [....]

答案 2 :(得分:0)

代码有三个问题。

对于初学者来说,不清楚为什么指针vp被声明为具有类型void *,尽管在程序中它仅用于指向double类型的对象。

为什么不宣布它像

double *vp = NULL;

结果这个技巧与指针

(double*)vp = &r;

将无法编译,因为在左侧,表达式(double*)vprvalue,可能未分配。

你可以写

vp = &r;

第二个问题是这个陈述

void area(vp);

也无效。要调用该函数,您应该写

area(vp);

第三个问题是返回类型为void的函数不应在return语句中指定表达式

此声明将被删除。

return 1;

从C标准(6.8.6.4返回声明)

  

1 带有表达式的return语句不应出现在a中   返回类型为void的函数。没有的返回语句   expression只出现在返回类型为void的函数中。

将函数的参数声明为具有引用类型是没有意义的。

函数定义可能看起来像

double area( double dp )
{
    const double PI = 3.14;

    return dp * dp * PI;
}

调用pf printf的语句应该在main

中移动
printf( "circle are is : %.2lf", area( r ) );