2011-05-14 25 views
0

我正在編寫一個程序來控制flashbulb。閃光燈響應用戶的按鍵而閃光。我試圖限制閃光燈的出現規律,以防止燈泡燒燬。我已經從這個論壇得到了一些幫助,但是我無法用我自己的方式實現這些代碼。使用A類用戶建議,具體如下:實現具有時間限制代碼的類很難(C++)

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

我收到了幾個語法錯誤,我似乎無法轉移,所有這些都是在任一類的第一個或最後一個括號 - 「語法錯誤:標識符'bulb'「,」語法錯誤:';'「,」語法錯誤:'}'「和」語法錯誤:'}'「。儘管如此,我從來沒有和班級一起工作過,所以期待這與此有關。我哪裏錯了?

請注意'10000'是閃光之間的最小延遲。

+0

''我收到一些語法錯誤'' - 請將您收到的所有錯誤都複製到您的問題中。您提供的數據越多,您獲得的相關答案就越多。 – pts 2011-05-14 13:18:26

+0

您需要在類聲明的'}'後面的代碼末尾使用分號。 – pts 2011-05-14 13:20:23

+0

謝謝,我已經添加到上述,以及我收到的錯誤 – CaptainProg 2011-05-14 13:26:35

回答

1

有你的代碼的幾個主要問題:

  • 缺少 ';'在類定義的末尾。
  • 在使用之前缺少定義HANDLE hSerial
  • 您在線路if (timepassed >= (((double)frequency)/10000))上錯誤地比較了時間和頻率。如果您希望將計數器從QueryPerformanceCounter轉換成實時使用類似:

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

如果您收到其他錯誤消息,他們之前或您發佈的片段後都涉及到代碼。一些更多的小問題和意見:

  • 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?

+0

謝謝 - 我已經實現了你所提到的一切,但不理解QueryPerformanceCounter到'實時'的轉換。我被這個論壇的另一個成員給了上述代碼的大部分,不知道如何使用「頻率」 - 據我所知,它將始終保持爲零?如果是這種情況,RealTime將始終是QueryPerformanceCounter值除以零,這是不可能的。您的幫助表示讚賞! – CaptainProg 2011-05-14 13:53:30

+0

I強烈反對最後一點(關於方括號) - 關於後來添加新行的觀點並沒有出售我,因爲我從來沒有見過任何人這樣做過。而且,格式化問題與OP的代碼無關任何情況下 – 2011-05-14 14:56:30

+0

它更像是一個可能超出問題範圍的風格問題,但在大多數討論中,人們似乎更喜歡使用大括號或將其全部保留在一行上:for示例請參閱http://stackoverflow.com/questions/815601/to-do-or-not-to-do-one-line-if-statements-and-curly-braces,以獲得關於SO的其他討論。 – uesp 2011-05-15 01:07:27

0

代碼中的最後}之後添加;

class bulb 
{ 
... 
}; 
+0

謝謝 - 完成。仍然有相同的錯誤,但感謝那 – CaptainProg 2011-05-14 13:23:48

+0

那麼,可能是最好的顯示完整的代碼? – 2011-05-14 13:27:20

+0

是的,我從評論開始就添加了它。雖然:( – CaptainProg 2011-05-14 13:30:17