我正在尝试使用自定义字体和位图图像创建一个简单的Watchface。 当我只是显示时间时,它工作正常。 我只使用了1个TextLayer。
static TextLayer *s_time_layer;
然后我决定在显示屏中添加日期和日期。 所以我又创建了两个TextLayers。
static TextLayer *s_day_layer,*s_date_layer;
创建这两个图层后,我成功地显示了日期和日期。但是手表停止了滴答。它只显示当前时间一次然后冻结。它显示我再次启动后的当前时间。
这是我更新时间的功能。
static void update_time(struct tm *tick_time)
{
time_t temp = time(NULL);
tick_time = localtime(&temp);
static char buffer[6];
static char daybuffer[9];
static char datebuffer[] = "00-00-00";
strftime(buffer, sizeof(buffer), "%I:%M", tick_time); //using 12 hr format
text_layer_set_text(s_time_layer,buffer);
strftime(daybuffer, sizeof(daybuffer), "%A", tick_time);
text_layer_set_text(s_day_layer, daybuffer); //display current day
strftime(datebuffer, sizeof(datebuffer), "%d/%m/%y", tick_time);
text_layer_set_text(s_date_layer, datebuffer); //display current date
}
为什么会发生这种情况?我该怎么做我的时钟?
答案 0 :(得分:0)
您定义了daybuffer[9]
,但最糟糕的情况是星期三是9个字符长+ null
终止符。
这意味着text_layer_set_text将在打印您的字符串时调用UB。
将缓冲区放大到10
字符。
查看strftime ManPage
你能找到的地方
返回值
提供结果字符串,包括终止空字节, 不超过最大字节数,strftime()返回字节数 (不包括终止空字节)放在数组s中。 如果 结果字符串的长度(包括终止空字节) 将超过最大字节数,然后strftime()返回0和内容 数组未定义。 请注意,返回值0不一定表示错误。 例如,在许多语言环境中,%p产生一个空字符串。一个空的 格式字符串同样会产生一个空字符串。