2016-12-12 10 views
2

Cでオプションのコールバックを指定する方法は何ですか?私はArduinoのハードウェアを常にポーリングして無線パケットを待つ長時間実行する関数を持っています。ハードウェアをポーリングしてパケットを読み取ることができなくなるたびにコールバックするオプションのコールバックを指定するオプションがあります。スケルトン関数の定義は次のとおりです。Cでオプションのコールバック

typedef void(*waitCallback)(const unsigned long elapsed); 

bool readPacket(unsigned long timeout, waitCallback cb) { 
    long time = millis(); 
    unsigned long delta = 0; 
    while(delta < timeout) { 
     if(receivedPacket()) { 
      return true; 
     } 
     delta = millis() - time; 
     cb(delta); 
    } 
    return false; 
} 

私の質問は、コールバックをオプションにすることができますか?私はボディを持たないダミー関数を作成し、コールバックをしたくない場合はコールバックとして指定することができますが、これを行うにはよりクリーンな方法がありますか?

+3

コールバックのためにNULLを渡して、関数内で 'cb!= NULL'それを呼び出す前に。 –

+3

'NULL 'でなければ' NULL'で 'call'をし、' readPacket'で 'NULL'を 'cb'でチェックして、コールバックをしたくない場合は' cb'を 'NULL'として渡します。 –

答えて

1

この場合、2つの方法を使用できますが、どちらもエレガントではなくクリーンではありませんが、このためには機能します。

方法1:NULLに転送し、内部で確認してください。

bool readPacket(unsigned long timeout, waitCallback cb) { 
    long time = millis(); 
    unsigned long delta = 0; 
    while(delta < timeout) { 
     if(receivedPacket()) { 
      return true; 
     } 
     delta = millis() - time; 
     if(cb!=null){ 
      cb(delta); 
     } 
    } 
    return false; 
} 

方法二:パラメータを指定せずに関数を定義します。これは暗黙のうちにメソッド1を使用します。

bool readPacket(unsigned long timeout){ 
    return readPacket(timeout, NULL); 
} 

2番目の方法を使用すると、他の仕様と一致するいくつかの汎用関数を作成できます。あなたは他の型のパラメータを渡して暗黙的にそれらをキャストし、前処理を行い、エラーをチェックするための他のパラメータを追加することができます...