繁体   English   中英

在 C 中使用紧凑指针寻址二维数组的元素

[英]Addressing elements of 2-dimensional array using compact pointer in 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 != '\0'; cp_nameCode++)
{
    charLoc = GetMorseCode(morseKey, first, last, *cp_nameCode);
    for(int col = 1; cp_morseKey[charLoc][col] != '\0'; col++)
    {
        cp_morseKey[charLoc][col] == '.' ? dot() : dash();            
    }
}

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

char **cp = morseCode;

然后在 *cp 和 **cp 的帮助下依次访问列和行。 但它不起作用。

或者,我尝试声明,

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

然后访问如下,

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

但是代码没有超出第一行。 我觉得我的指针知识仍然存在差距。

我将不胜感激任何解决此瓶颈的指针。

您可以使用要编码为数组的 INDEX 的 LETTER 来简化查找表。 例如(未测试,没有“防弹”或错误检查,仅适用于大写字母 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;
}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM