2014-01-15 106 views
1

我正在为Pebble平台开发一个项目。应用程序是用C编写的,我的问题不是特定于该平台的。结构比较

Pebble API有一个名为PblTm的Struct,每秒由一行代码填充。我的目标是比较结构和当前时间。我创建了PblTm结构,并将它们填充到需要与之比较的时代。我只关心结构的小时和分钟部分。到目前为止,我有以下代码。

bool comp_time(int h1, int m1, int h2, int m2, int h3, int m3) { 

    if((h1<=h2) && (h2<=h3)) //Is start hour <= now hour <= end hour? 
    { 
     if((h1=h2) && (m2>=m1)) //If start hour = now hour, is now min >= start min ? 
     { 
      return true; 
     } 
     if((h2=h3) && (m2<=m3)) //If end hour = now hour, if now min <= end min? 
     { 
      return true; 
     } 
     if((h1>h2) && (h2<h3)) //If start hour < now hour < end hour? 
     { 
      return true; 
     } 
    } 
    else 
    { 
     return false; 
    } 
    return false; 

} 

我最初想自己养活结构作为参数传递给函数是这样的:

​​

然后引用的函数内部结构的元素,我永远无法得到那个编译,我无法找到关于它的信息。 (我可能没有搜索正确的术语)。

我则改为饲养int参数函数本身是这样的:

comp_time(first_start.tm_hour,first_start.tm_min,now.tm_hour,now.tm_min,first_end.tm_hour,first_end.tm_min) 

这是做的相当笨拙的方式,但我已经做的工作​​输入这一切了。然而,我的主要问题是比较功能不起作用。它返回(显然是随机的,我还没有找到一个模式)对于不适合的值是真的,对于那些适合的值是错误的。

你有什么想法吗?

+3

您的比较不起作用,因为您使用单个等于'='而不是double等于'=='来检查相等性。这将需要一个实际的答案来解释为什么你的函数调用不起作用。 – Xymostech

+0

@Xymostech谢谢!我不知道我怎么没有接受。 –

回答

1

好了,你的参数名称使它很难了解它的代码和原因,所以让我们把它改写了一下:

bool comp_time(int hstart, int mstart, int hnow, int mnow, int hend, int mend) { 
    if ((hstart <= hnow) && (hnow <= hend)) 
    { 

到目前为止好。我们知道如果hnow小于hstart或大于hend那么它不可能是真的。

if((hstart==hnow) && (mnow>=mstart)) return true ; // BAD 

除了修为==,而不是=,这仍然是错误的。你只测试边界的一边。你需要测试对阵双方startend,以确保你的范围内:

if (((hstart < hnow) || (mstart <= mnow)) && 
    ((hnow < hend) || (mnow <= mend))) { return true ; } 
+0

好的,谢谢你的帮助。用最后一块代码,我必须承认我并不完全理解正在发生的事情,但它确实有效,我写了一个快速程序来检查应用程序其余部分的所有复杂性。似乎我们已经测试过,小时落在了我们的价值观之间,为什么我们知道mstart和mend都是<=? –

2

你真的应该更新,以卵石SDK2这对于时间提供了time_t值。该值是一个时间戳(number of seconds since epoch),您可以在一次操作中轻松进行比较。

+0

我想到了这一点,但尽管必须重写我的应用程序,但我不确定,因为我只需要在一天内比较,我将如何处理动态更新自每个时代以来的秒数。 –

+0

int seconds_since_midnight = tm.tm_hour * 3600 + tm.tm_min * 60 + tm.tm_sec; – sarfata