2

最近のインタビューで興味深い質問がありました。

関数ポインターと時間間隔を受け入れる関数を実装する必要があります。そして、func1every を呼び出せるようにする必要がありますtime_interval

クロック ティックごとに呼び出される API が提供されます。create_timer への複数の呼び出しが存在する可能性があります。その場合、それぞれの時間間隔に従って各関数ポインターを呼び出す必要があります。

    // api    
    create_timer(&func, interval) 

    // call to api would look like
    create_timer(&func1, 10);
    create_timer(&func2, 5);

関数ポインターのリンクされたリストを作成することを提案しましたが、その場合、すべてのクロックティックの線形検索になります。それは良い解決策ではありません。

プライオリティ キュー ソリューションも提案しましたが、うまくいきませんでした。すべての関数で create_timer が呼び出された時刻を保存し、現在時刻との差を計算し、その差が time_interval の倍数である場合は、関数を呼び出す必要があります。

興味深い解決策はありますか?

4

2 に答える 2

1

「関数ポインタのリンクリストを作成することを提案しました」

この種の実装では、関数を呼び出す必要があるかどうかを確認するために、新しいティックごとに計画されたすべてのイベントを何度も繰り返す必要があることに注意してください。

より良いアプローチは、明確に定義された順序で並べ替えられたデータ構造を使用することです。たとえば、すべてのイベントが順番に並べ替えられ、処理/実行されますすなわち:

create_timer(&func1, 10);
create_timer(&func2, 5);
create_timer(&func3, 15);

次のプライオリティ キューになる可能性があります。

5   func1
10  func2
15  func3

タイマーが 5 番目のティックに到達するまでに、それを呼び出してキューから削除し、更新された値 "last val + "func1を使用してこのキューに戻します。5

10  func2
10  func1
15  func3

等々。

于 2013-10-19T23:56:30.817 に答える