【问题标题】:Difficulty implementing classes with time-limiting code (C++)使用限时代码 (C++) 难以实现类
【发布时间】:2011-05-14 13:10:27
【问题描述】:

我正在编写一个程序来控制闪光灯。闪光灯响应用户的按键而触发。我试图限制闪光灯的发生规律,以防止灯泡烧坏。我已经从这个论坛获得了一些帮助,但是我无法用我自己的代码来实现。一位用户建议使用一个类,如下:

class bulb
{
    __int64 clocks;
    __int64 frequency;
    public:
    bulb()
    {
        LARGE_INTEGER li;
        QueryPerformanceFrequency(&li);
        frequency = li.QuadPart;
        clocks = 0;
    }
    void WINAPI flash (HINSTANCE hThisInstance,
           HINSTANCE hPrevInstance,
           LPSTR lpszArgument,
           int nFunsterStil)
    {
        LARGE_INTEGER li;
        QueryPerformanceCounter(&li);

        // If this is the first occurence, set the 'clocks' to system time (+10000 to allow flash to occur)
        if (clocks == 0) clocks = li.QuadPart + 10000;

        __int64 timepassed = clocks - li.QuadPart;
        if (timepassed >= (((double)frequency) / 10000))
        {
            //Set the clock
            clocks = li.QuadPart;
            //Define the serial port procedure
            HANDLE hSerial;
            //Open the serial port (fire the flash)
            hSerial = CreateFile("COM1", GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
            //Close the serial port
            CloseHandle(hSerial);
        }
    }
};

我收到一些似乎无法转换的语法错误,所有这些错误都位于类的第一个或最后一个括号 - “语法错误:标识符'灯泡'”,“语法错误:';' ”、“语法错误:'}'”和“语法错误:'}'”。不过,我以前从未使用过课程,所以希望这与此有关。我哪里错了?

请注意“10000”是闪烁之间的最小延迟。

【问题讨论】:

  • ``我收到一些语法错误'' -- 请将您收到的所有错误复制到您的问题中。您提供的数据越多,您获得的相关答案就越多。
  • 你需要在代码的最后一个分号,在类声明的}之后。
  • 谢谢,我已将其添加到上面,以及收到的错误
  • 我看到你还没有声明hSerial
  • 谢谢 - 也解决了这个问题。同样的错误适用:S

标签: c++ class


【解决方案1】:

您的代码有几个主要问题:

  • 缺少一个';'在类定义的末尾。
  • 在使用之前缺少定义 HANDLE hSerial
  • 您在if (timepassed >= (((double)frequency) / 10000)) 行上错误地比较了时间和频率。如果您希望将计数器从 QueryPerformanceCounter 转换为实时,请使用以下内容:

    double RealTime = (double) clocks / (double) frequency;

如果您收到其他错误消息,它们与您发布的 sn-p 之前或之后的代码有关。还有一些小问题和 cmets:

  • QueryPerformanceFrequencyQueryPerformanceCounter 都可能失败。除非获取无效值无关紧要,否则您应该检查这些返回值。
  • 您打开了一个 COM 端口,但未向其写入任何内容或确认打开是否成功。
  • 为避免将来出现问题,if 语句 if (clocks == 0) 应全部位于一行或包含括号,即以下之一:

if (clocks == 0) clocks = li.QuadPart + 10000;

if (clocks == 0) {
    clocks = li.QuadPart + 10000;
}

编辑: 将 QueryPerformanceCounter 转换为实时的示例(不包括错误检查):

LARGE_INTEGER Frequency;
LARGE_INTEGER Counter;

QueryPerformanceFrequency(&Frequency);
QueryPerformanceCounter(&Counter);

   //Time in seconds
double RealTime = (double) Counter.QuadPart / (double)Frequency.QuadPart;

LARGE_INTEGER Counter1;
QueryPerformanceCounter(&Counter1);

   //Elapsed time in seconds
double DeltaTime = (double) (Counter1.QuadPart - Counter.QuadPart) / (double)Frequency.QuadPart;

另请参阅:How to use QueryPerformanceCounter?

【讨论】:

  • 谢谢 - 我已经实现了您提到的所有内容,但不了解将 QueryPerformanceCounter 转换为“实时”。该论坛的另一位成员向我提供了上述大部分代码,但我不明白“频率”是如何使用的——据我所知,它总是保持为零?如果是这种情况,那么 RealTime 将始终是 QueryPerformanceCounter 值除以零,这是不可能的。感谢您的帮助!
  • 我非常不同意最后一点(关于括号)——关于稍后添加新行的论点并没有说服我,因为我从未见过有人这样做。曾经。在任何情况下,格式问题都不是 OP 代码的真正问题。
  • 这更像是一个风格问题,可能超出了问题的范围,但在大多数讨论中,人们似乎更喜欢保留大括号或将其全部放在一行上:例如参见 stackoverflow.com/questions/815601/…与其他人就 SO 进行良好的讨论。
【解决方案2】:

在您的代码中最后一个} 之后添加;

class bulb
{
...
};

【讨论】:

  • 谢谢 - 完成。仍然有同样的错误,但谢谢
  • 是的,自从您发表评论后,我就添加了它。虽然错误是相同的:(
猜你喜欢
  • 1970-01-01
  • 2011-08-25
  • 1970-01-01
  • 2021-03-20
  • 1970-01-01
  • 1970-01-01
  • 2017-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多