用C++紧凑指针寻址二维数组元素 [英] Addressing elements of 2-dimensional array using compact pointer in C

查看:19
本文介绍了用C++紧凑指针寻址二维数组元素的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用C实现摩尔斯代码,遇到了一些基础知识。

基本思想是我有一个从A到Z的二维字符数组,每个数组的第一个元素是一个字母表,后面跟着相应的莫尔斯电码。程序将收到一个字符,它将被解析通过整个数组,一旦找到匹配,我将吐出摩尔斯电码。我可以使用简单的数组操作来运行此程序,但在使用紧凑数组时遇到问题。

数组定义如下

char *morseKey[37] = { 
    {"A.-"},
    {"B-..."},
    {"C-.-."},
    {"D-.."},
    {"E."},
    {"F..-."},
    {"G--."},
    {"H...."},
    {"I.."},
    {"J.---"},
    {"L.-.."},
    {"K-.-"},
    {"L.-.."},
    {"M--"},
    {"N-."},
    {"O---"},
    {"P.--."},
    {"Q--.-"},
    {"R.-."},
    {"S..."},
    {"T-"},
    {"U..-"},
    {"V...-"},
    {"W.--"},
    {"X-..-"},
    {"Y-.--"},
    {"Z--.."}
};

常规二维数组实现

/*
    Find a match for each character from nameCode string that need to be 
    transformed to Morse Code. Once the match is found then based on the 
    Morse code flash the LED for dash and dot.
*/
for(char *cp_nameCode = &nameCode[0]; *cp_nameCode != ''; cp_nameCode++)
{
    charLoc = GetMorseCode(morseKey, first, last, *cp_nameCode);
    for(int col = 1; cp_morseKey[charLoc][col] != ''; col++)
    {
        cp_morseKey[charLoc][col] == '.' ? dot() : dash();            
    }
}

现在我的方法是声明一个指向此数组的指针,如下所示

char **cp = morseCode;
然后在*cp和**cp的帮助下按顺序访问列和行。但它不起作用。

或者,我尝试声明,

char **cp = morseCode;
char *cp_row = *morseCode;

然后访问,如下图所示

while(*cp != '')
{
    while(*cp_row != '')
    {
        //printf("%c
", **cp++);
        printf("%c
", *cp_row++);
    }
    cp_row = *((++*cp));
    //cp++;
}

但是代码不会超出第一行。我觉得我的指针知识还有差距。

如有任何解决此瓶颈的建议,我将不胜感激。

推荐答案

您可以使用要编码的字母作为数组的索引来简化查找表。例如(未测试、无防弹或错误检查,仅适用于大写字母A..Z):

#define NELMS(A) A/sizeof(A[0])

char *morseKeys[] = { 
    ".-",
    "-...",
    "-.-.",
    "-..",
    ".",
    "..-.",
    "--.",
    "....",
    "..",
    ".---",
    ".-..",
    "-.-",
    ".-..",
    "--",
    "-.",
    "---",
    ".--.",
    "--.-",
    ".-.",
    "...",
    "-",
    "..-",
    "...-",
    ".--",
    "-..-",
    "-.--",
    "--.."
};

char *encodeLetter(char letter) {
  return morseKeys[letter - 'A'];
}

char decodeLetter(char *code) {
  // Search array
  for (int i=0; i < NELMS(morseKeys); i++) {
    if (strcmp(morseKeys[i], code) == 0)
      return 'A' + i;
  }
  // Not found
  return 0;
}

希望这会有帮助.至少有一点。

问:获得正确的莫尔斯字符串(例如";-.";)后,您需要执行哪些额外处理?从您的代码中,我不清楚您还需要做什么(如果有)。


在上面的示例中,我试图显示:

  • 您不需要在morseKey[]值中包含字母(例如";A";)
  • 不需要指定数组长度(";37";),
  • 搜索数组不一定需要";循环";。例如,";encodeLetter()";通过使用字母作为索引值进行";直接查找。它的速度要快得多。

回答您的另一个问题:如果您想用char**指针迭代morseKey[]值,您可以这样做:

char *strings[] = { "AAA", "BBB", "CCC", 0 };
char **pp = strings;
while (*pp)
  printf ("value: %s
", *pp++);

这篇关于用C++紧凑指针寻址二维数组元素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆