在Pebble Watchface应用程序上创建多个文本图层

时间:2015-10-08 12:27:50

标签: c

我正在尝试使用自定义字体和位图图像创建一个简单的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

         }

为什么会发生这种情况?我该怎么做我的时钟?

1 个答案:

答案 0 :(得分:0)

您定义了daybuffer[9],但最糟糕的情况是星期三是9个字符长+ null终止符。

这意味着text_layer_set_text将在打印您的字符串时调用UB

将缓冲区放大到10字符。

查看strftime ManPage

你能找到的地方

  

返回值

     

提供结果字符串,包括终止空字节,          不超过最大字节数,strftime()返回字节数          (不包括终止空字节)放在数组s中。 如果          结果字符串的长度(包括终止空字节)          将超过最大字节数,然后strftime()返回0和内容          数组未定义。          请注意,返回值0不一定表示错误。          例如,在许多语言环境中,%p产生一个空字符串。一个空的          格式字符串同样会产生一个空字符串。