【问题标题】:Use #define to define an array size使用#define 定义数组大小
【发布时间】:2015-07-06 20:18:09
【问题描述】:

我曾经从一个以 125 SPS 发送样本的 ADC 捕获 5 秒的数据,这转化为一个大小为 5 * 125 的数组。在我的代码中,这看起来像:

#define SPS 125
#define TIME 5

char Samples[SPS * TIME];

现在,我想捕获 2.5 秒的数据并将 ADC 采样率提高到 250 SPS。在代码中它看起来像:

#define SPS 250
#define TIME 2.5

char Samples[SPS * TIME];

但是如果我这样做,编译器会抛出一个错误:

#901 expression must have integral or enum type main.cpp line 59 C/C++ Problem

我能理解它在说什么。

但是,在牢记 SPS 和 TIME 定义的可用性的情况下,克服这种情况的最佳方法是什么。我的意思是我已经在项目的其他几个地方使用了它们,我希望继续使用它们。

请帮忙!

【问题讨论】:

  • 也许演员会起作用。尝试将结果转换为int
  • 以毫秒为单位定义时间。
  • 另一种方式是为TIME定义单独的分子和分母,并声明char Samples[SPS * TIME_NUM / TIME_DENOM];
  • 问题是你有一个“混合表达式”:整数 * 浮点数;产生浮点数的最终表达式。正如 Cool Guy 和 Arun A.S 正确建议的那样,一种解决方案是将表达式“转换”为“int”。

标签: c arrays c-preprocessor


【解决方案1】:

问题是结果转换为浮点数(或双精度),但数组的大小必须是整数类型。最简单的解决方案是@CoolGuy 建议的,您可以将其转换为int。这是一个例子

#define SPS 125
#define TIME 2.5

char Samples[ (int)(SPS * TIME) ];

【讨论】:

    【解决方案2】:

    您是否尝试过强制转换为 unsigned int?

    char Samples[(unsigned int)(SPS * TIME)];
    

    【讨论】:

      【解决方案3】:

      我假设这是一个嵌入式系统,因此您可能不想为此使用浮点数,因为这样做通常会迫使您将浮点库链接到项目。

      浮动免费版:

      #define SPS       250ul
      #define TIME_MS   2500ul
      #define SAMPLES_N ( (SPS * TIME_MS) / 1000ul )
      
      char Samples[SAMPLES_N];
      

      如果你坚持使用浮动:

      #define SPS        250
      #define TIME       2.5
      #define SAMPLES_N  ((unsigned long)(SPS * TIME))
      
      char Samples[SAMPLES_N];
      

      (这两个 sn-ps 将适用于所有平台,包括小型 8/16 位 MCU 应用程序。与所有发布的使用 int 的答案不同,它们是不可移植的。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-06
        • 2012-12-20
        • 2016-05-02
        • 1970-01-01
        • 2011-08-16
        • 2018-02-09
        • 1970-01-01
        • 2013-04-13
        相关资源
        最近更新 更多