2016-04-16 6 views
0

私はこのプログラムを作ったが、私はエラーが発生しています "(関数)"の対立するタイプ " " (機能)の宣言はここにあった」と述べた。私のgccコンパイラは私に、(関数)の対立型として表示するエラーを返します

システムでコマンドプロンプトを使ってDev C++のgccコンパイラを使ってコンパイルしました。 誰でも私のここでの不具合を理解する助けができますか?

#include<stdio.h> 
#include<math.h> 
main() 
{ 
    int a,b,c; 
    float area; 
    float ar(int a,int b,int c); 
    printf("Enter the lenghts of the three sides of a triangle"); 
    scanf("%d%d%d",&a,&b,&c); 
    area=ar(a,b,c); 
    printf("The are a of the triangle is=%.2f",area); 
} 
ar(a,b,c) 
{ 
    float area,s; 
    s=(a+b+c)/3; 
    area=sqrt((s*(s-a)*(s-b)*(s-c))); 
    return area; 
} 
+0

基本的なCの本やチュートリアルを終了しましたか? – kaylum

+0

はい私は... !! –

+0

文字通り「(機能)の相反するタイプ」と言いますか?あるいは何らかの理由で私たちの関数名を隠しているのですか? –

答えて

1

実際の関数定義ではなく、プロトタイプで戻り値の型を指定するという問題があります。特定の定義を持つプロトタイプを書くときは、実際の関数を書くときに同じ定義に従わなければなりません。

また、floatに整数の値をキャストして、領域を正しく計算できるようにしました。整数を取ってCの浮動小数点数で割ったとき、整数に何を割り当てるかにかかわらず整数になります。キャストはこの動作を変更します。

#include<stdio.h> 
#include<math.h> 
int main() 
{ 
    int a,b,c; 
    float area; 
    float ar(int a,int b,int c); 
    printf("Enter the lenghts of the three sides of a triangle"); 
    scanf("%d%d%d",&a,&b,&c); 
    area=ar(a,b,c); 
    printf("The are a of the triangle is=%.2f",area); 
} 
float ar(int a,int b,int c) 
{ 
    float area,s; 
    s=(float)(a+b+c)/3; 
    area=sqrt((s*(s-a)*(s-b)*(s-c))); 
    return area; 
} 

これはきれいにコンパイルします:

が、この考えてみましょう。

+0

偉大な、今それを得て、常に覚えています、十分に感謝することができない、私はこれが私の以前のプログラムのおかげでエラーだったかもしれないと思う。 –

+0

投票と受諾は私が必要とするすべての感謝です。;) –

+1

これはコンパイルされますが、貧弱なスタイルです。パラメータは 'int a、int b、int c'として宣言する必要があります。また、プロトタイプが 'main'の内部にあるので、コンパイラは、定義が一致しない場合(例えば、元のコードの場合)、バグを診断する必要はありません。 'main'の前にプロトタイプを置く方がずっと良いでしょう。 –

2

戻り値の型がfloatでfloat ar(int a、int b、int c)の関数 "ar"を宣言しました。戻り値なしで定義しました。ここで問題が発生しました。 これを試してください:コマンドで

#include<stdio.h> 
    #include<math.h> 
    float ar(int a,int b,int c); 

    void main() 
    { 
     int a,b,c; 
     float area; 
     printf("Enter the lenghts of the three sides of a triangle"); 
     scanf("%d%d%d",&a,&b,&c); 
     area=ar(a,b,c); 
     printf("The are a of the triangle is=%.2f",area); 
    } 
    float ar(int a,int b,int c) 
    { 
     float area,s; 
     s=(a+b+c)/3; 
     area=sqrt((s*(s-a)*(s-b)*(s-c))); 
     return area; 
    } 

コンパイル:gccの-std = c99を-o stack_16_4_16 stack_16_4_16.c -lm

0

私はここでの説明のビットを含めることを試みた:

#include<stdio.h> 
#include<math.h> 

float ar(int a,int b,int c); 
/* This is a function declaration and just like variables, functions are 
* also limited by scope. If you declare the function inside the main, 
* then the function cannot be called outside the main. That is the purpose 
* it is declared here. 
*/ 

int main() 
{ 
    int a,b,c; 
    float area; 

    printf("Enter the lengths of the three sides of a triangle : "); 
    scanf("%d%d%d",&a,&b,&c); 
    area=ar(a,b,c); 
    printf("The are a of the triangle is = %.2f",area); 

    return 0; 
} 

    float ar(int a,int b,int c) 
    /* Note that I have added the types of arguments 
    * In older versions of C it is not uncommon to see functions like 
    * float ar(a,b) 
    * int a,b; 
    * {Some Stuff Here} 
    * The above function style was problematic - it couldn't deal with mismatched arguments. 
    * So it is a good practice to specify the type of the parameters. 
    * In fact this was ANSI C standard's solution to the problems of mismatched arguments. 
    */ 
    { 
    float area,s; 
    s=(a+b+c)/(float)2; 
    /* Either the numerator or the denominator should be float for the output to be float 
    * So I casted the denominator to a float value. Also, if you're using Heron's formula 
    * the denominator should be 2 , not 3. 
    */ 

    area=sqrt(s*(s-a)*(s-b)*(s-c)); 

    return area; 
    } 
0

戻り値の型を関数に追加する必要があります。

#include<stdio.h> 
#include<math.h> 
main() 
{ 
    int a,b,c; 
    float area; 
    float ar(int a,int b,int c); 
    printf("Enter the lenghts of the three sides of a triangle"); 
    scanf("%d%d%d",&a,&b,&c); 
    area=ar(a,b,c); 
    printf("The are a of the triangle is=%.2f",area); 
} 
float ar(float a, float b, float c) 
{ 
    float area,s; 
    s=(a+b+c)/3; 
    area=sqrt((s*(s-a)*(s-b)*(s-c))); 
    return area; 
} 
関連する問題