我正在尝试使用指针找到圆圈的面积和周长。正确的代码如下所示
#include<stdio.h>
void main(){
int radius;
float area, peri;
printf("Enter the radius of a circle: ");
scanf("%d", &radius);
areaperi(radius, &area, &peri);
printf("Area is %f\nPerimeter is %f", area, peri);
}
areaperi(int r, float *a, float *b){
*a = 3.14*r*r;
*b = 2*3.14*r;
}
但是,如果我在声明并扫描半径并将r
中的areaperi()
更改为#include<stdio.h>
void main(){
float radius;
float area, peri;
printf("Enter the radius of a circle: ");
scanf("%f", &radius);
areaperi(radius, &area, &peri);
printf("Area is %f\nPerimeter is %f", area, peri);
}
areaperi(float r, float *a, float *b){
*a = 3.14*r*r;
*b = 2*3.14*r;
}
时将半径数据类型替换为float,则会给我一个错误。
DerefMut
[错误] areaperi的冲突类型
我使用Dev C ++。
我不明白为什么我的代码不适用于radius的浮动值。
答案 0 :(得分:5)
根本不是异常行为;它是C标准所要求的。
在您调用areaperi()
时,该函数的范围没有原型。因此,它被认为是一个返回int
且其参数受默认促销约束的函数 - float
转换为double
且任何整数类型都短于int
(因此short
和char
)会提升为int
。
将areaperi()
的定义更改为:
areaperi(float r, float *a, float *b)
第一个参数的类型不再与推断类型一致,因此您会收到错误。
您的功能应在使用前声明。它没有返回值,因此应该使用返回类型void
声明和定义它。另外,main()
returns an int
。回显输入和计算值是个好主意,特别是因为代码没有检查scanf()
调用是否成功。
因此,您需要:
#include <stdio.h>
void areaperi(float r, float *a, float *b);
int main(void)
{
float radius;
float area, peri;
printf("Enter the radius of a circle: ");
scanf("%f", &radius);
areaperi(radius, &area, &peri);
printf("Radius is %f\nArea is %f\nPerimeter is %f",
radius, area, peri);
return 0;
}
void areaperi(float r, float *a, float *b){
*a = 3.14*r*r;
*b = 2*3.14*r;
}
这些规则存在的原因是向后兼容性&#39;使用预先标准的C。
请注意,C99及更高版本要求在使用之前声明函数,并要求所有函数都具有显式返回类型。优良作法是确保声明实际上是原型。请注意,如果您在void areaperi();
之前写了main()
,它会声明该函数但不提供原型 - 它表示areaperi()
是一个返回no的函数value但是参数列表没有被描述,除了可变长度参数列表之外可以是任何东西(那些需要原型,原型最后有, ...)
)。
答案 1 :(得分:2)
将forward declaration提供给areaperi()
函数并添加void
作为返回类型
#include<stdio.h>
void areaperi(float r, float *a, float *b);
void main(){
float radius;
float area, peri;
printf("Enter the radius of a circle: ");
scanf("%f", &radius);
areaperi(radius, &area, &peri);
printf("Area is %f\nPerimeter is %f", area, peri);
}
void areaperi(float r, float *a, float *b){
*a = 3.14*r*r;
*b = 2*3.14*r;
}
答案 2 :(得分:2)
试试这段代码
#include<stdio.h>
void areaperi(float r, float *a, float *b);
void main()
{
float radius;
float area, peri;
printf("Enter the radius of a circle: ");
scanf("%f", &radius);
areaperi(radius, &area, &peri);
printf("Area is %f\nPerimeter is %f", area, peri);
}
void areaperi(float r, float *a, float *b){
*a = 3.14*r*r;
*b = 2*3.14*r;
}