web-dev-qa-db-ja.com

競合する型と以前のxの宣言はここにありました...何ですか?

時間があるときに数ヶ月間自分でCを教えていましたが、問題が発生しました。修正方法がわかりません。

具体的には、gccを使用してこれをコンパイルしようとすると、次のようになります。

 geometry.c:8:エラー: 'trapezoid'のタイプが競合しています
 geometry.c:7:注: 'trapezoid'の以前の宣言はここにありました
 geometry.c:48 :エラー: 'trapezoid' 
 geometry.c:7のタイプが競合しています:注: 'trapezoid'の以前の宣言はここにありました
 geometry.c:119:エラー: 'trapezoid_area'のタイプが競合しています
 geometry.c:59:注: 'trapezoid_area'の以前の暗黙の宣言はここにありました
 geometry.c:関数 'cone_volume':
 ometry.c:128:エラー:呼び出されましたオブジェクト「3.14100000000000001421085471520200371742248535156e + 0」は関数ではありません
 geometry.c:関数「cylinder_volume」内:
 ometry.c:136:エラー:呼び出されたオブジェクト「3.14100000000000001421085471520200371742248535156e +0」は関数ではありません関数

さて、関数をタイプキャストする必要があるかもしれないと思いますが、繰り返しになりますが、よくわかりません。

3.141と定義したPIを関数として読みたいようです。マジックナンバー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; }
8
Bowlslaw

「暗黙の」定義があったと言っている人は誰でも:これは事前に宣言することで解決できます。例として、float trapezoidおよびint trapezoidを事前に宣言しましたが、trapezoid_areaを事前に宣言していません。他の人が指摘しているように、C++のようにCでオーバーロードすることもできません。

暗黙の乗算を実行しようとしているいくつかの領域では、たとえば、PI(pow(r、2))PI *(pow(r、2)) =。

7

表示されているエラーは、同じ関数を異なるシグネチャで2回定義しているためです。

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

他の定義に基づくと、最初のtrapezoid関数にはtrapezoid_volumeという名前を付ける必要があるようです。

float trapezoid_volume(float b1, float b2, float h);
int trapezoid();
4
JaredPar

[〜#〜] c [〜#〜]は関数のオーバーロードをサポートしていません。 C++あります。

また、誤ってtrapezoid_volumetrapezoidとして宣言したため、コンパイラエラーが発生します。

3
MSN

2回関数台形を定義しました。 CはC++ではありません。オーバーロード機能を使用してC++で行うように、異なるシグネチャで同じ関数を定義することはできません。

1
Heisenbug
#define PI 3.141

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

私はあなたが欲しいと思います

float trapezoid_volume(...);
/*             ^^^^^^^                 */
1
pmg

PIの定義に関する質問に答えるには、piは通常math.hで(M_PIとして)定義されますが、実際の標準の一部ではないため、取得するためにいくつかの構成を行う必要がある場合がありますそれ。

たとえば、MSVCを使用する場合、それを取得するには_USE_MATH_DEFINESを定義する必要があります。見る

プラットフォームにそれがない場合は、次のようなものをヘッダーにスローすることをお勧めします。

#ifndef
#define M_PI 3.14159265358979323846264338327
#endif
0
Michael Burr