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): error C2099: initializer is not a constant 1>c:\users\user\desktop\r\gammavol.c (21): 警告 C4013: 'gamma' 未定义;假设 extern 返回 int

第 14 行是 const double log_pi = log(M_PI); 第 21 行是 log_gamma = gamma(dimension/2.0 + 1);

提前致谢

4

4 回答 4

0

两条错误信息非常清楚。

第一个说您不能用非常量值初始化变量。

虽然log(M_PI)确实是常量,但编译器不能这样对待它,因为它不知道函数是否log()总是返回相同的结果。确实如此,但编译器必须假设它没有,因此是“非常量”。

第二个说gamma你试图在这里调用的函数没有定义。

因此,它假设它是一个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;

第二个错误是因为编译器找不到函数gamma。似乎它没有在您的math.h. 如果您没有收到链接器错误,我建议您添加:

double gamma (double);

正确的做法是找到要包含的正确头文件。 这个问题可以提供一些启示。

于 2013-11-09T13:17:08.283 回答
0

log(M_PI)不是常量表达式,它是一个常量限定对象,在 C 语言术语中不是常量。为此,您需要声明一个命名常量,您应该使用#defineor enum,但不能使用const限定符。类型变量const double不是 C 中的常量

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

静态 const 需要在编译时初始化,你在那里放一个函数调用。诸如 gcc 之类的高级编译器无论如何都可以在编译时计算类似的东西,并且只会警告非法构造而不是出错。你的显然没有这个能力。

另一件事是它gamma()不是标准的 libmath 函数,它们是一些 Unix 非标准的东西,你可以在 BSD 和 Linux 上找到,但在你的 Windows 上却没有(根据你的路径名)。无论如何它已被弃用,并且tgamma()lgamma()C99 中有标准化。

于 2013-11-09T13:20:34.050 回答