我相对知道c,只学习其中的部分来发布卵石C/pebblekitjs应用程序以跟踪总线。到目前为止,我已经在节点服务器上处理了数据,并且我准备通过JS文件处理数据。但是,我的一个问题在于C代码。
此代码过程数据存储在从JS发送的密钥字典中,并将其分配给以下面使用的变量。通过使用#Define var 9,我可以成功地将。高值设置为9。但是,通过int var,它会失败并丢弃错误:initializer element不变?。
这个错误是什么意思,如果我不定义静态和常数之间的差异到底是什么。显然静态var不返回任何东西吗?一些帮助将不胜感激。
更新:问题仍然没有解决。除初始化器外,还会出现以下新错误消息。error: (near initialization for 's_data_points[0].high')
int key0_buffer;
void process_tuple(Tuple *t)
{
//Get key
int key = t->key;
//Get integer value, if present
int value = t->value->int32;
//Get string value, if present
char string_value[32];
strcpy(string_value, t->value->cstring);
//Decide what to do
switch(key) {
case key_0:
//Location received
key0_buffer = value;
break;
}
}
static WeatherAppDataPoint s_data_points[] = {
{
.city = "San Diego",
.description = "surfboard :)",
.icon = WEATHER_APP_ICON_GENERIC_WEATHER,
.current = 110,
.high = key0_buffer,
.low = 9,
},
};
尝试一下:
enum { key0_buffer = 9 };
c在初始化全局变量时不能为运行时计算提供。(该概念确实以C 功能称为"动态初始化"。)
执行模型是它可以将全局变量的所有字节存储在ROM中,然后将任何可修改变量与单个
memcpy
一起复制到RAM中。将一个全球分配给另一个全球会更复杂。#define
允许您替换文本9
,这是一个常数的表达式。使用文本替换以避免变量为原始,不必要的低级且潜在效率低下时,许多人皱眉。但是,在这种情况下,结果应该相同。
在C中,
enum
常数具有int
型,因此它们是合适的替代品。不过,您对其他类型的运气不佳。
函数中的代码与定义静态变量的代码下部的代码之间存在关键差。功能代码是可执行的 - 这些线将在调用函数时运行。
您的WeatherAppDatapoint的静态声明只是告诉编译器创建静态变量。您在该声明中放置的初始化值告诉编译器将这些数据初始化为什么值。这就是为什么它们必须保持恒定的原因 - 这些是在执行任何内容之前被加载的值。
#Define语句只是告诉预处理器将" var"的所有实例替换为字符串" 9"。它与文本编辑器中的剪切和粘贴操作几乎相同。在编译器看到代码之前,这要完成。这就是为什么您没有问题的原因;编译器看到一个字面的常数,就像您直接将" 9"键入源代码一样。
。在" C"中,变量不会返回事物,它们将它们存储。只有函数返回事物。如果要将整数声明在某个地方声明,然后将其分配给静态变量的值,那是一个实际可执行的代码行,需要在函数内部的某个地方(即您的Process_Tuple函数内部)发生。静态声明下方的代码行未在运行时执行,他们只是设置了程序的初始状态,并告诉编译器变量有多大。