2017-05-10 16 views
-5

ヘルプ、それは私が<10なら02 02 not 2 !!!私はarduinoのライブラリを編集しようとしているC++(Arduinoのライブラリ)

int hour() { // the hour now 
    char s[25]; 
    return sprintf(s,"%02d", hour(now)); 
} 

を試してみました。しかし、それは迷惑な結果を返すだ

int hour() { // the hour now 
    return hour(now()); 
} 

だ、私は中にプログラムする方法がわかりませんC++では、数値が10より小さい場合は "0"を出力するだけです。Heitor。ありがとうございます。

+0

誰でも投票する前にコメントを控えてください。将来的に改善するのに役立ちます。 – Billa

答えて

0

迷惑な結果が何であるかはわかりませんが、あなたが示したことに基づいて私はパントを取って、時刻()の不一致の戻り値型に関するコンパイルエラーを起こすと思います。無効なメモリにアクセスしています。

time()関数で0のプレフィックス番号を返す場合は、戻り値の型を変更する必要があります。ただし、char *に変更すると、スタックに割り当てられたメモリへのポインタが返されます。あなたが帰るとすぐに無効になるメモリ。

あなたがする必要があるのは、hour()ではなくhour()を呼び出すコードにメモリバッファを置くことです。それから、バッファのサイズとともにtime()に渡します。

あなたの呼び出し元のコードは次のようになります:

char s[25]; // 25 still seems excessive, I suggest 3, so you can fit two digits plus zero termination. 

hour(s, 25); 

とあなたの時間を()関数は次のようになります。

void hour(char* pBuffer, size_t size) { 
    snprintf(pBuffer, size, "%02d", hour(now())); 
} 
0

あなたがデータを毎回割り当てることをせずに結果を返すしたい場合このようなものを使うことができます。

注:値でしか動作-99 999

typedef union 
{ 
    char str[4]; 
    int i; 
} CharInt; 

CharInt hour() 
{ 
    CharInt ci = {0}; 
    sprintf(ci.str,"%02d", hour(now())); 
    return ci; 
} 

int main() 
{ 
    printf("%s", hour().str); 
} 
+0

慎重に答えてください。 '時間(now())'が関数です。 – Billa

0

に誰もがあなたの質問に述べたようにvague.Butは私があなたを助けるかもしれないと思うあなたのタイトルと内容からです。

10より小さいすべての桁(時間)の前に0を印刷する必要があると思います。それは時間が1であればそれはあなたが、あなたはあなたがいないint関数からchar配列を返すされているすべてのあなたのsketch.Firstでいくつかのミスを犯し必要なものだならば、01など

を印刷しています。 hour(now)の代わりにhour(now())が必要です。

char * hour() { // the hour now 
    static char s[25]; //might be 5 is enough and more 
    sprintf(s,"%02d", hour(now())); 
    return s; 
} 

PS:あなたは、呼び出し側で整数の変数に格納した場合の戻り値の型がchar配列があるとして、あなたはSerial.println (hour());

としてそれを直接印刷する必要があるnow.So int hr = hour();言うかのように、それは文句を言わない可能性が
+0

@Heitor Badottiはこの回答が役に立ちました。 – Billa

0

sはhour()関数のローカルなので、返すと範囲外になり、存在しなくなります。だから、プロセッサはそれを他の何かに上書きすることが自由です。呼び出し元が配列にアクセスしようとすると、その関数内にあるものの代わりに、その上に書き込まれたものがすべて取得されます。関数からローカル変数へのポインタを返そうとは決してしないでください。

関連する問題