0

「sqrtof2」エラーの複数の定義を取得しています。あるCプログラムを取得して、別のCプログラムから2の平方根を取得しようとしています。次に、メイクファイルを使用してそれらをまとめます。とても失われた

   #include <stdio.h>
    #include <math.h>
    #include "make2.c"


    int  main(void) {

        double num =2.0;
        // calls the sqrt function  make2.c

        sqrtof2(num);

        printf("The sqaure root: %f", num);


        return(0);
    }


2nd program: make2.c


    #include <stdio.h>

    #include <math.h>

    sqrtof2 (double  num4) {
    double num5 = 0;
    num5= sqrt(num4);

    return num5;

}


makeupfile: make3.h
#ifndef TEST_H_INCLUDED
#define TEST_H_INCLUDED


    void sqrtof2(void);

#endif
4

6 に答える 6

2

これらはすでにメイン ファイルに含まれており、メイン ファイルには make2.c ファイルが含まれているため、make2.c ファイルで"#include <math.h>"andを実行する必要はありません。"#include <stdio.h>"これでエラーは取り除かれますが、何が起こっているのかを適切に診断するには、Makefile の正確な内容を確認する必要があります。少なくとも、暗黙の宣言に関する追加の警告が必要です。

更新: このプログラムのやり方は最善ではありません。ヘッダー ファイルを使用して、別のファイルに含まれる関数のプロトタイプを指定し、メイン プログラムで個々のオブジェクト ファイルをリンクする必要があります。

更新 2: 誰かが私にあなたのファイルを実際にコンパイルするように要求したので、最初のプログラムをmake1.cに、2 番目のプログラムを に入れましmake2.cた。Makefile が不要なため、入力するだけで、コンパイル エラーのないmake make1動作するプログラムを取得make1できますが、もちろん、間違った答えが返されます (1.4 ではなく 2...)。

他の回答の1つで指摘されているように、プログラムには複数の宣言よりも多くの問題があります。関数から返された値をまったく使用していませんsqrtof2

の平方根を計算し、結果num 格納しnumたい場合は、次のように言う必要があります。num = sqrtof2(num);

しかしもちろん、それは依然として間違った答えを生み出します。

その理由は、関数が暗黙的に整数値を返すように設定されているためです。関数の宣言の前に配置する必要がありますdouble。つまり、double sqrtof2 (double num4)

しかし、make make1もう一度入力しても何も起こりません。.c別の C ファイル内にファイルをインクルードすることの問題を見つけ始めます。プログラムは、 make1.cのmakeソース コードが make2.c の更新された内容に依存していることを検出できません。1.414214のあなたの望む答え...touch make1.cmake make1

したがって、プログラムを構築する方法については、他の回答のいくつかの優れたアドバイスに従ってください。:)

于 2013-06-28T02:01:06.143 に答える
1

コンパイル方法は次のとおりです (いくつかの明確なコメントを追加しました)。

メインファイルmain.c:

#include <stdio.h>
#include <math.h>
#include "make2.h" /* we include the header containing sqrtof2 */

int  main(void)
{

    double num = 2.0;
    // calls the sqrt function

    printf("The square root: %f", sqrtof2(num)); /* I've moved the call to sqrtof2 here so that it will print the proper answer */


    return 0;
}

定義するソース ファイルsqrtof2 make2.c:

#include <stdio.h>
#include <math.h>
#include "make2.h" /* note that we include the header where sqrtof2 is declared so we can define it here */

double sqrtof2 (double  num4) /* note the return type and function parameters as they were incorrect in the header */
{
    double num5 = 0;
    num5= sqrt(num4);

    return num5;

}

最後にsqrtof2宣言されているヘッダーmake2.h:

#ifndef TEST_H_INCLUDED
#define TEST_H_INCLUDED


double sqrtof2(double  num4); /* I've changed the function signature to match that of the implementation file */

#endif

最後にコンパイルするために、次のように呼び出します (への-lmリンクには が使用されますmath.h)。

gcc main.c make2.c -lm

そして出来上がり!すべてが警告なしでコンパイルされます。

于 2013-06-28T02:12:47.377 に答える
0

を返すように関数を定義する必要がありますdouble

double sqrtof2 (double  num4) {
    double num5 = 0;
    num5= sqrt(num4);

    return num5;
}

それ以外の場合、コンパイラはそれが返されたと想定しintます。

代わりにヘッダーファイルを使用する必要があります#include "make2.c"

于 2013-06-28T02:03:13.137 に答える
0

の関数宣言のみを含む make2.h ファイルを作成sqrtof2 (double num4) し、メイン ファイルに make2.c の代わりにその .h ファイルを含めます。

include は基本的に、インクルード ファイルの内容をインクルード ファイルにコピーします。sqrtof2 関数が make2.c で 1 回、.c ファイルが含まれている場合は main で 2 回定義されているため、エラーが発生しています。

于 2013-06-28T02:05:43.660 に答える
0

他の人が指摘したように、コードには多くの問題がありますが、sqrtof2(num) への呼び出しに割り当てがないため、同じ関数の別の宣言のように見えるため、エラーが発生します。次のように、値を別の変数に返す必要があります。

double rVal = sqrtof2( num ) ;

そして、それをあなたの答えとして印刷してください。他のすべてのものも修正しますが、これなしでは機能しません。

于 2013-06-28T02:10:22.507 に答える