使用#define定义数组大小

时间:2015-04-28 06:14:36

标签: c arrays c-preprocessor

我曾经从一个ADC发送了5秒的数据,这个数据是在125 SPS发送样本的,这被转换为大小为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定义的可用性。我的意思是我已经在项目的其他几个地方使用过它们,我希望继续使用它们。

请帮忙!

3 个答案:

答案 0 :(得分:6)

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

var rgx4 = new Regex(@"[\r\n'/\\]");
var tst = "\r \n ' /\\";
tst = rgx4.Replace(tst, string.Empty);

答案 1 :(得分:5)

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

Float free version:

#define SPS       250ul
#define TIME_MS   2500ul
#define SAMPLES_N ( (SPS * TIME_MS) / 1000ul )

char Samples[SAMPLES_N];

如果你坚持使用float:

#define SPS        250
#define TIME       2.5
#define SAMPLES_N  ((unsigned long)(SPS * TIME))

char Samples[SAMPLES_N];

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

答案 2 :(得分:2)

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

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