我一直在寻找解决方案,尽管有SO和其他地方的代码片段和说明,但它似乎不起作用。我想要的是在外部定义一个非常大的数组,以免使代码混乱,并在我的主文件中使用该定义。
这真的很简单:
controller.h定义变量:
short KM[72][3][3][3][3][3][3];
KM[0][0][0][0][0][0][0] = 0;
KM[1][0][0][0][0][0][0] = 0;
KM[2][0][0][0][0][0][0] = 0;
// ...
// 50.000 more lines, not all =0
我希望它可以在main.ino中工作
extern short KM; // or KM[72][3][3][3][3][3][3], tried a lot
#include "controller.h"
void loop() {
...
}
但是没有(“ controller.h:[...]错误:'KM'没有命名类型”)。我想要的只是在controller.h中隔离的值可以在main.ino中使用。
我正在使用Arduino IDE和ESP32。
答案 0 :(得分:1)
您不能使用这样的多个语句来初始化数组。尝试使用类似的东西:
short KM[72][3][3][3][3][3][3] = {
0, 0, ...
};
或使用功能:
void initKM(short KM[72][3][3][3][3][3][3]) {
KM[0][0][0][0][0][0][0] = 0;
}
还应该在源文件(KM
?)中定义controller.c
,并在头文件中包含extern
,这样,如果您共享头,将只有一个定义。 KM。
请注意,我并不是真正地试图确定语法,而是让您了解如何实现此语法。
有关正确的初始化语法,请参见this answer。
答案 1 :(得分:0)
将声明放在头文件中:
extern short KM[72][3][3][3][3][3][3];
将定义放入源文件:
short KM[72][3][3][3][3][3][3] = { … };
要将仅某些元素定义为非零,请使用指定的初始化程序:
short KM[72][3][3][3][3][3][3] = {
[37][1][1][1][2][2][0] = 4,
…
};
如果有连续的连续非零元素,则可以指定第一个元素并列出以下元素:
short KM[72][3][3][3][3][3][3] = {
[37][1][1][1][2][2][0] = 4, 5, 6, 9, 3,
…
};
(编译器可能会警告您,这是在这种情况下禁用的可接受警告。)
将标头包含在使用该数组的任何源文件中,包括定义该标头的源文件。
编译定义数组的源文件,并在链接程序时包含它。
只有声明(包括定义)和预处理程序语句可以在函数外部。诸如KM[0][0][0][0][0][0][0] = 0;
之类的赋值语句只能出现在函数内部。