2

オープン ソースの R ツリーを使用しようとしていますが、エラーが発生します。私はそれを修正するために数時間を費やしましたが、できませんでした。助けてください。コードの一部は次のとおりです。

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


#ifndef M_PI
#   define M_PI 3.1415926535
#endif
#ifndef ABS
#   define ABS(a) ((a) > 0 ? (a) : -(a))
#endif

#define EP .0000000001

const double log_pi = log(M_PI);



double sphere_volume(double dimension)
{
    double log_gamma, log_volume;
    log_gamma = gamma(dimension/2.0 + 1);
    log_volume = dimension/2.0 * log_pi - log_gamma;
    return exp(log_volume);
}

次のエラーが表示されます: 1>c:\users\user\desktop\r\gammavol.c(14): エラー C2099: 初期化子は定数ではありません 1>c:\users\user\desktop\r\gammavol.c (21): 警告 C4013: 'ガンマ' 未定義; extern が int を返すと仮定

14 行目は const double log_pi = log(M_PI); です。21 行目は log_gamma = gamma(dimension/2.0 + 1); です。

前もって感謝します

4

4 に答える 4

0

2 つのエラー メッセージは非常に明確です。

最初のものは、変数を非定数値で初期化できないことを示しています。

whileは確かに定数ですが、関数が常に同じ結果を返すlog(M_PI)かどうかがわからないため、コンパイラはそれをそのように扱うことができません。log()ありますが、コンパイラはそうではないと想定する必要があるため、「非定数」です。

gamma2 つ目は、ここで呼び出そうとする関数が定義されていないことを示しています。

したがって、それはextern int gamma(). この関数がどこで宣言されているか不明なため、少なくともそのプロトタイプを含む適切なヘッダー ファイルをインクルードする必要があります。

于 2013-11-09T13:13:42.503 に答える
0

この行は、最初のエラーの原因です:

const double log_pi = log(M_PI);

log(M_PI)は定数ではないため、初期化では使用できません。代わりに次を使用するか、定義をmain関数内に移動して を削除しconstます。

const double log_pi = 1.1447298858494002;

2 番目のエラーは、コンパイラが関数を見つけられないためですgamma。で定義されていないようですmath.h。リンカー エラーが発生しない場合は、次を追加することをお勧めします。

double gamma (double);

正しいことは、インクルードする適切なヘッダー ファイルを見つけることです。 この質問は、いくつかの光を当てることができます。

于 2013-11-09T13:17:08.283 に答える
0

log(M_PI)は定数式ではなく、C 言語用語では定数ではない定数修飾オブジェクトです。このためには、 または のいずれ#defineかを使用する必要がある名前付き定数を宣言する必要がありますenumが、const修飾子は使用しないでください。型の変数はconst double、C では定数ではありません

#define log_pi log(M_PI)
于 2013-11-09T13:17:30.910 に答える
0

static const はコンパイル時に初期化する必要があり、そこに関数呼び出しを置きます。gcc などの高度なコンパイラは、とにかくコンパイル時にこのようなものを計算でき、エラーを出す代わりに不正な構造について警告するだけです。あなたのものは明らかにこれができません。

もう 1 つは、gamma()これは標準の libmath 関数ではないということです。これらは、BSD や Linux では見られるが、Windows では (パス名で調べると) 見られない Unix の非標準的なものです。とにかく非推奨であり、C99 で標準化されているtgamma()とがあります。lgamma()

于 2013-11-09T13:20:34.050 に答える