我正在尝试使用开源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&gt; c:\ users \ user \ desktop \ r \ gammavol.c(14):错误C2099:初始化程序不是常量 1&gt; 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);
提前致谢
答案 0 :(得分:0)
这两条错误信息非常清楚。
第一个说你不能用非常数值初始化变量。
虽然log(M_PI)
确实是常量,但编译器不能这样对待它,因为它不知道函数log()
是否总是返回相同的结果。确实如此,但编译器必须假定它没有,因此“非常数”。
第二个说你试图在这里调用的函数gamma
没有定义。
因此,它假定它是extern int gamma()
。由于不清楚此函数的声明位置,您至少应该包含包含其原型的相应头文件。
答案 1 :(得分: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);
正确的做法是找到要包含的正确头文件。 This question可以解释一下。
答案 2 :(得分:0)
log(M_PI)
不是常量表达式,它是一个常量限定对象,在C语言术语中不是常量。为此,您需要声明一个命名常量,您应该使用#define
或enum
,而不是const
限定符。 const double
类型的变量不是C 中的常量。
#define log_pi log(M_PI)
答案 3 :(得分:0)
静态const需要在编译时初始化,你在那里放一个函数调用。像gcc这样的高级编译器无论如何都可以在编译时计算这样的东西,并且只会警告非法构造而不是错误。你的人显然没有能力做到这一点。
另一件事是gamma()
不是标准的libmath函数,它们是你在BSD和Linux上找到的一些非标准的东西,但在你的Windows上没有(按你的路径名)。无论如何它已被弃用,{C}标准化为tgamma()
和lgamma()
。