2016-10-04 6 views
0

ファームウェアプロトタイプ用の再利用可能なロギングモジュールを作成しています。ラッパー関数を持つロガーAPIを持っていますvoid LogWithNum(eLogSubSystem sys, eLogLevel level, char * msg, int * number)ジェネリックロガー関数のchar *の長さを調べる方法は?

このラッパー関数では、システム固有の書き込み関数が呼び出されます。たとえば、UARTやディスプレイドライバ...

システムのすべての書き込み/送信機能は、何らかの形でメッセージの長さを必要とします。そして、私のラッパー関数は、送るべきメッセージにchar *だけを与えます。私のラッパーはシステムUART送信関数を呼び出す場合には、例えばここを参照してください:

void LogWithNum(eLogSubSystem sys, eLogLevel level, char * msg, int * number) 
{ 

    UARTDRV_Transmit(handle, char * msg, int msglen); 
} 

私は基本的な送信機能に適切にそれを渡すことができますので、私は、任意のメッセージの長さを引き出すことができますどのように?

私はuC上にあり、スペースを節約したいので、大きなライブラリを使いたくないです。あなたの問題を解決するため

+2

'msg'にASCII文字だけが含まれていると、おそらく' strlen() 'ですか? –

+2

'strlen()'を使うことはできませんか、単に 'char *'をインクリメントする単純なループと 'NUL'を満たすまでカウンタを書くことはできませんか? –

+0

明確ではありません:あなたの例は 'msg'ではなく' number'を送信しています – LPs

答えて

5

さまざまな方法:

void LogWithNum(eLogSubSystem sys, eLogLevel level, char * msg, int * number) 
{ 
    while (*msg != '\0') 
     UARTDRV_Transmit(handle, msg++, 1); 
} 

有無にかかわらずmsg長さを計算null終端まで

void LogWithNum(eLogSubSystem sys, eLogLevel level, char * msg, int * number) 
{ 
    UARTDRV_Transmit(handle, msg, strlen(msg)); 
} 

またはループを計算するstrlenを使用し

上記の溶液を組み合わせるstrlen

void LogWithNum(eLogSubSystem sys, eLogLevel level, char * msg, int * number) 
{ 
    int msg_length = 0; 

    while (*msg++ != '\0') 
     msg_length++; 

    if (msg_length > 0) 
     UARTDRV_Transmit(handle, msg, msg_length); 
} 
+1

あるいは、 'strlen()'を使うのではなく手動で長さを見つけるためにループすることができます。もう一方に)。 – TripeHound

関連する問題