繁体   English   中英

为什么 C 中的变量 static 定义在编译时失败?

[英]Why static definition of variable in C fails while compiling?

请任何人帮助我为什么符号常量的这种定义会在函数中产生以下 static 变量的错误定义:错误:“变量”的存储大小不是恒定的

        #define SAMPLE_RATE 200 /* Sample rate in Hz. */
        #define MS_PER_SAMPLE   ( (double) 1000/ (double) SAMPLE_RATE)
        #define MS10    ((int) (10/ MS_PER_SAMPLE + 0.5))
        #define MS25    ((int) (25/MS_PER_SAMPLE + 0.5))
        #define MS30    ((int) (30/MS_PER_SAMPLE + 0.5))
        #define MS80    ((int) (80/MS_PER_SAMPLE + 0.5))
        #define MS95    ((int) (95/MS_PER_SAMPLE + 0.5))
        #define MS100   ((int) (100/MS_PER_SAMPLE + 0.5))
        #define MS125   ((int) (125/MS_PER_SAMPLE + 0.5))
        #define MS150   ((int) (150/MS_PER_SAMPLE + 0.5))
        #define MS160   ((int) (160/MS_PER_SAMPLE + 0.5))
        #define MS175   ((int) (175/MS_PER_SAMPLE + 0.5))
        #define MS195   ((int) (195/MS_PER_SAMPLE + 0.5))
        #define MS200   ((int) (200/MS_PER_SAMPLE + 0.5))
        #define MS220   ((int) (220/MS_PER_SAMPLE + 0.5))
        #define MS250   ((int) (250/MS_PER_SAMPLE + 0.5))
        #define MS300   ((int) (300/MS_PER_SAMPLE + 0.5))
        #define MS360   ((int) (360/MS_PER_SAMPLE + 0.5))
        #define MS450   ((int) (450/MS_PER_SAMPLE + 0.5))
        #define MS1000  SAMPLE_RATE
        #define MS1500  ((int) (1500/MS_PER_SAMPLE))
        #define DERIV_LENGTH    MS10
        #define LPBUFFER_LGTH ((int) (2*MS25))
        #define HPBUFFER_LGTH MS125#define WINDOW_WIDTH MS80            // Moving window integration width.
    #define FILTER_DELAY (int) (((double) DERIV_LENGTH/2) + ((double) LPBUFFER_LGTH/2 - 1) + (((double) HPBUFFER_LGTH-1)/2) + PRE_BLANK)  // filter delays plus 200 ms blanking delay
    #define DER_DELAY   WINDOW_WIDTH + FILTER_DELAY + MS100



    int lpfilt( int datum ,int init)
        {
        static long y1 = 0, y2 = 0 ;
        static int data[MS_PER_SAMPLE], ptr = 0 ;
        .....

int lpfilt( int datum ,int init)
    {
    static int data[MS_PER_SAMPLE], ptr = 0 ;
....
int hpfilt( int datum, int init )
    {
    static int data[HPBUFFER_LGTH], ptr = 0 ;
...


int deriv1(int x, int init)
    {
    static int derBuff[DERIV_LENGTH], derI = 0 ;
...

int deriv2(int x, int init)
    {
    static int derBuff[DERIV_LENGTH], derI = 0 ;
...
int mvwint(int datum, int init)
    {
    static int data[WINDOW_WIDTH], ptr = 0 ;
...

我不知道问题可能是什么,无论我是否用 (int) 重新输入计算结果,它仍然会产生错误。 符号常量定义中不允许重新输入吗?

此清单常量中使用的表达式

#define MS_PER_SAMPLE   ( (double) 1000/ (double) SAMPLE_RATE)

具有 double 类型。

它不是 integer 常量表达式。

因此,您可能不会将此清单常量用作数组的大小,例如在此声明中。

static int data[MS_PER_SAMPLE], ptr = 0 ;

您可以定义常量,例如

#define MS_PER_SAMPLE   ( ( int ) ( 1000.0 / SAMPLE_RATE ) )

或者保持清单常量声明,你可以写

static int data[( int )MS_PER_SAMPLE], ptr = 0 ;

为什么 C 中的变量 static 定义在编译时失败?

您不能在常量中使用+ 0.5 研究如何仅使用整数舍入 integer。

数组大小必须是一个常量表达式。 cppreference 常量表达式

integer 常量表达式是一个仅由

  • [...其他点....]
  • 浮动常量,但前提是它们立即用作转换为 integer 类型的操作数

double0.5不是“立即转换”(如(int)0.5 ),而是与 operator +一起使用以添加一个int 因此错误。

查看您的代码,概念证明可能如下所示:

// the simplest based on https://stackoverflow.com/questions/2422712/rounding-integer-division-instead-of-truncating
// but see also https://elixir.bootlin.com/linux/v4.17/source/include/linux/kernel.h#L132
#define DIV_ROUND(x, d)  ((x + (d / 2)) / d)

#define SAMPLE_RATE 200 /* Sample rate in Hz. */
#define MS_PER_SAMPLE   (1000 / SAMPLE_RATE)
#define MS125   DIV_ROUND(125, MS_PER_SAMPLE)
#define HPBUFFER_LGTH MS125
static int data[HPBUFFER_LGTH];

因为我看到(int)在您的代码中随处可见,所以现在是阅读integer 常量类型和转换的好时机。 因为您使用宏,所以一定要了解宏陷阱

KamilCuk 是对的,常数 0.5 在我的符号常数中无效。 将 0.5 更改为 1/2 并删除所有转换为 (double) 解决了这个问题。 非常感谢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM