2011-04-01 25 views
7

我一直在自学下了几个月,当我有时间,我遇到了一个问题,我不知道如何解决。冲突的类型和x的先前的声明在这里......什么?

具体而言,当我尝试编译这个使用gcc,我得到:

 
geometry.c:8: error: conflicting types for ‘trapezoid’ 
geometry.c:7: note: previous declaration of ‘trapezoid’ was here 
geometry.c:48: error: conflicting types for ‘trapezoid’ 
geometry.c:7: note: previous declaration of ‘trapezoid’ was here 
geometry.c:119: error: conflicting types for ‘trapezoid_area’ 
geometry.c:59: note: previous implicit declaration of ‘trapezoid_area’ was here 
geometry.c: In function ‘cone_volume’: 
geometry.c:128: error: called object ‘3.14100000000000001421085471520200371742248535156e+0’ is not a function 
geometry.c: In function ‘cylinder_volume’: 
geometry.c:136: error: called object ‘3.14100000000000001421085471520200371742248535156e+0’ is not a function 

现在,我想我可能需要强制转换的功能,但同样,我不知道。

它看起来要读取PI,我已经定义为3.141,为函数。有没有一种方法可以避免使用幻数3.141(尽管它比其他幻数小得多)?

//Geometric formulae 
#include <stdio.h> 
#include <math.h> 

#define PI 3.141 

float trapezoid(float b1, float b2, float h); 
int trapezoid(); 
float sphere_volume(float r); 
int sphere(); 
float cone_volume(float r, float h); 
int cone(); 
float pyramid_volume(float b, float h); 
int pyramid(); 
float cylinder_volume(float r, float h); 
int cylinder(); 

int main(void) { 
     char selection = 0; 

     while(selection != 'q') { 
       printf("\t--Geometric Formulas--\n"); 
       printf("\tSelection an option from the menu: "); 
       scanf("%c", & selection); 
       switch(selection) { 
         case 1: //Trapezoid area 
           printf("%d", trapezoid()); 
           break; 
         case 2: //Sphere volume 
           printf("%d", sphere()); 
           break; 
         case 3: //Cone volume 
           printf("%d", cone()); 
           break; 
         case 4: //Pyramid volume 
           printf("%d", pyramid()); 
           break; 
         case 5: //Cylinder volume 
           printf("%d", cylinder()); 
           break; 
         default: 
           break; 
       } 
     } 
} 
//  --Shape Menus-- 
//Trapezoid 
int trapezoid() { 
     float h = 0, b1 = 0, b2 = 0; 
     float traparea; 

     printf("\tTrapezoid base 1: "); 
     scanf("%3f", &b1); 
     printf("\tTrapezoid base 2: "); 
     scanf("%3f", &b2); 
     printf("\tTrapezoid height: "); 
     scanf("%3f", &b2); 

     traparea = trapezoid_area(b1, b2, h); 

     printf("\tTrapezoid Area: %3f\n", traparea); } 

//Sphere 
int sphere() { 
     float r = 0; 
     float spherevol; 

     printf("\tSphere radius: "); 
     scanf("%f", &r); 

     spherevol = sphere_volume(r); 

     printf("\tSphere volume: %3f\n", spherevol); } 

//Cone 
int cone() { 
     float r = 0, h = 0; 
     float conevol; 

     printf("\tCone radius: "); 
     scanf("%f", &r); 
     printf("\tCone height: "); 
     scanf("%f", &h); 

     conevol = cone_volume(r, h); 

     printf("\tCone volume: %3f\n", conevol); } 

//Pyramid 
int pyramid() { 
     float b = 0, h = 0; 
     float pyramidvol; 

     printf("\tPyramid base: "); 
     scanf("%f", &b); 
     printf("\tPyramid height: "); 
     scanf("%f", &h); 

     pyramidvol = pyramid_volume(b, h); 

     printf("\tPyramid volume: %3f\n", pyramidvol); } 

//Cylinder 
int cylinder() { 
     float r = 0, h = 0; 
     float cylindervol; 

     printf("\tCylinder radius: "); 
     scanf("%f", &r); 
     printf("\tCylinder height: "); 
     scanf("%f", &h); 

     cylindervol = cylinder_volume(r, h); 

     printf("Cylinder volume: %3f", cylindervol); } 

//  --Geometric Formulas-- 
//Trapezoid Area Computation 
float trapezoid_area(float b1, float b2, float h) { 
     return ((b1 + b2) * h)/2; } 

//Sphere Volume Computation 
float sphere_volume(float r) { 
     return ((pow(r,3)) * (4 * PI))/3; } 

//Cone Volume Computatioin 
float cone_volume(float r, float h) { 
     return ((PI(pow(r,2)) * h))/3; } 

//Pyramid Volume Computation 
float pyramid_volume(float b, float h) { 
     return (b * h)/3; } 

//Cylinder Volume Computation 
float cylinder_volume(float r, float h) { 
     return (PI(pow(r,2))) * h; } 

回答

6

任何他们那说有一个“隐”的定义:这可以通过声明前就可以解决。例如,您预先声明了浮动梯形int梯形,但您未预先声明trapezoid_area。正如其他人指出的那样,你也不能像在C++中那样在C中重载。

在你试图做隐含乘法几个领域 - 例如,PI(POW(R,2))PI *(POW(R,2))

+2

我不介意提名,但是......我只回答了问题的一小部分。你确定你打算选择我的正确答案吗? – 2011-04-04 23:43:48

1

您定义了两次函数梯形。 C不是C++。您不能像C++中使用重载功能一样定义具有不同签名的相同函数。

+0

谢谢... ...固定,但现在它显示 /tmp/ccn6YvQ0.o:函数'sphere_volume': geometry.c :(.text + 0x39d):对'pow'的未定义引用 /tmp/ccn6YvQ0.o:在函数'cone_volume'中: geometry.c :(.text + 0x3d0):未定义的引用'pow' /tmp/ccn6YvQ0.o:函数'cylinder_volume': geometry.c :(.text + 0x41b):未定义引用'pow' collect2:ld返回1退出状态 – Bowlslaw 2011-04-01 21:30:01

+0

@Bowlslaw:你还没有链接数学库。如果您使用的是linux,请使用-lm选项尝试gcc。 – Heisenbug 2011-04-01 21:32:37

+0

尽管我已经链接了math.h库,但-lm选项可行。 – Bowlslaw 2011-04-01 21:40:12

4

您所看到的错误是因为你与不同的签名

float trapezoid(float b1, float b2, float h); 
int trapezoid(); 

根据您的其他定义,它看起来像第一trapezoid功能应该被命名为trapezoid_volume

float trapezoid_volume(float b1, float b2, float h); 
int trapezoid(); 
定义两次同样的功能
1
#define PI 3.141 

float trapezoid(float b1, float b2, float h); 
int trapezoid(); 

我想你想

float trapezoid_volume(...); 
/*    ^^^^^^^     */ 
3

Ç不支持函数重载。 C++一样。

而且由于您不小心将trapezoid_volume标为trapezoid,您会收到编译器错误。

0

要回答你的问题有关定义PI - 圆周率通常在math.h定义(如M_PI),但因为它不是一部分FO实际的标准,你可能需要做一些配置,以获取它。

例如,使用MSVC时,您需要定义_USE_MATH_DEFINES才能得到它。对于GNU C库的信息,请参阅

如果您的平台没有它,你可能要抛出类似以下内容的标题:

#ifndef 
#define M_PI 3.14159265358979323846264338327 
#endif 
相关问题