【问题标题】:Converting error code to Morse Code in c在c中将错误代码转换为摩尔斯电码
【发布时间】:2014-07-28 16:17:13
【问题描述】:

我正在尝试编写一个程序,该程序将(最终)闪烁 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 值并从左到右抓取每个数字呢?

将值作为字符串传递并将每个 char 转换为 int 是否更好?

【问题讨论】:

  • while(*(errorCode + i))errorCode[i++] 是语法错误,因为 errorCode 不是指针。除此之外,将其转换为字符串并输出每个字符可能同样容易。
  • 我希望能绕过这些错误。即,那些适用于无符号整数的代码位的实现。我现在意识到尝试从二进制表示中拆分一个整数是没有意义的。我不情愿地转向使用字符串。也许最好的办法是使用二进制/八进制/十六进制错误代码,我可以对它们进行按位运算?

标签: c morse-code


【解决方案1】:

您需要将整数转换为数字序列。你可以通过一个简单的递归 div/mod 循环来做到这一点:

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

或者您可以使用 sprintf 将数字转换为 ASCII 字符串,然后发出这些数字。

【讨论】:

  • 这个问题的完美答案。但是我正在研究一个微控制器(我没有在问题中说明)所以我对递归有点警惕。虽然我想这不会炸毁我的筹码。
猜你喜欢
  • 1970-01-01
  • 2015-03-18
  • 2010-12-23
  • 1970-01-01
  • 2020-04-22
  • 1970-01-01
  • 1970-01-01
  • 2013-02-12
  • 1970-01-01
相关资源
最近更新 更多