【问题标题】:Struct comparison结构比较
【发布时间】:2014-01-15 17:52:19
【问题描述】:

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

Pebble API 有一个名为PblTm 的结构,每秒由一行代码填充。我的目标是将结构与当前时间进行比较。我创建了 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;

}

我最初尝试将结构本身作为参数提供给函数,例如:

comp_time(&first_start,&now,&first_end);

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

然后我改为将 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)

这是一种相当笨拙的方式,但我已经完成了将其全部输入的工作。然而,我的主要问题是比较功能不起作用。对于不适合的值,它返回(显然是随机的,我无法找到模式)true,对于一些适合的值,它返回 false。

你有什么想法吗?

【问题讨论】:

  • 您的比较不起作用,因为您使用单等号= 而不是双等号== 来检查是否相等。需要一个实际的答案来解释为什么您的函数调用不起作用。
  • @Xymotech 谢谢!我不知道我怎么没听懂。

标签: c struct comparison pebble-watch


【解决方案1】:

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

【讨论】:

  • 我想过,但尽管必须重写我的应用程序,但我不确定,因为我只需要在一天内比较,我将如何处理动态更新每个纪元以来的秒数天。
  • int seconds_since_midnight = tm.tm_hour * 3600 + tm.tm_min * 60 + tm.tm_sec;
【解决方案2】:

好的,所以你的参数名称使得阅读代码和推理变得非常困难,所以让我们重写一下:

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 ; }

【讨论】:

  • 好的,感谢您的帮助。对于最后一段代码,我必须承认我并不完全理解发生了什么,但它确实有效,我编写了一个快速程序来检查它,而不是应用程序其余部分的所有复杂性。似乎我们已经测试了小时落在我们的值之间,为什么 mnow
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多