1

(最終的に) LED を点滅させてモールス符号のエラー コードを示すプログラムを作成しようとしています。

現在、エラーコードを左から右に読み取る方法を理解することに(ほとんど)行き詰まっています。

現時点では、プログラムのベースを取り込もうとしています。エラー コードを指定して関数を呼び出します -> モールス信号をコンソールに出力します。

ここに私が持っているものがあります:

#define LED_DIT '.'
#define LED_DAH '-'
#define LED_INTER_GAP "" /* Delays within a letter */
#define LED_SHORT_GAP " " /* Delay between letters */
#define LED_MEDIUM_GAP "\n" /* Delay between words */

#include <stdio.h>
#include <stdint.h>

char morseDigits[10][5] = {
    {LED_DAH, LED_DAH, LED_DAH, LED_DAH, LED_DAH}, // 0
    {LED_DIT, LED_DAH, LED_DAH, LED_DAH, LED_DAH}, // 1
    {LED_DIT, LED_DIT, LED_DAH, LED_DAH, LED_DAH}, // 2
    {LED_DIT, LED_DIT, LED_DIT, LED_DAH, LED_DAH}, // 3
    {LED_DIT, LED_DIT, LED_DIT, LED_DIT, LED_DAH}, // 4
    {LED_DIT, LED_DIT, LED_DIT, LED_DIT, LED_DIT}, // 5
    {LED_DAH, LED_DIT, LED_DIT, LED_DIT, LED_DIT}, // 6
    {LED_DAH, LED_DAH, LED_DIT, LED_DIT, LED_DIT}, // 7
    {LED_DAH, LED_DAH, LED_DAH, LED_DIT, LED_DIT}, // 8
    {LED_DAH, LED_DAH, LED_DAH, LED_DAH, LED_DIT} // 9
};

void LEDMorseDigit(uint8_t digit) {
    uint8_t i;

    for(i=0; i<5; i++) {
        printf(morseDigits[digit][i]);
        printf(LED_INTER_GAP);
    }
}

void LEDMorseCode(uint8_t errorCode) {

    uint8_t i = 0;

    // Play error sequence of digits, left to right
    while(*(errorCode + i)) {
        LEDMorseDigit(errorCode[i++]);
        printf(LED_SHORT_GAP);
    }
    printf(LED_MEDIUM_GAP);

}

int main(void) {
    LEDMorseCode(1);
    LEDMorseCode(23);
    LEDMorseCode(123);

    return 0;
}

これwhile(*(errorCode + i)) {...}は、char* を左から右に読み取る例から取ったものです。データを保持するための新しい変数を作成せずにこれを行いたいと思います。

モジュロ/除算で右から左に数値を読み取り、逆のエラーコードで関数を呼び出すことを検討しましたが、混乱を招く可能性があるため、そうしないことをお勧めします。

では、u-int 値を取り、各桁を左から右に取得する関数を作成するにはどうすればよいでしょうか?

値を文字列として渡し、各文字を int に変換するだけのほうがよいでしょうか?

4

1 に答える 1

1

整数を一連の数字に変換する必要があります。シンプルな再帰的な div/mod ループでそれを行うことができます:

void LEDMorseCode(unsigned errorCode) {
    if (unsigned r = errorCode/10) {
        LEDMorseCode(r);
        printf(LED_SHORT_GAP); }
    LEDMorseDigit(errCode % 10);
}

または、 を使用して数値を ASCII 文字列に変換し、sprintfそれらの数字を出力することもできます。

于 2014-07-28T16:41:47.737 に答える