复制多维数组 C

copy multidimensional array C

我是 C 的新手,我创建了一些不起作用的代码...

我在 initLetterLib() 时收到警告:整数转换导致截断

我尝试将我的 libraryLetter 存储到我的 outputLED 中,但它不起作用。 我只是将 0x00 放入我的输出 LED。 我试图在 outputLED 中复制其他内容 - 这非常有效。 但是我不明白为什么我的 libraryLetters 有问题...

    #define LETTER_WIDTH 6

    typedef unsigned char letter[LETTER_WIDTH];

    letter libraryLetters[128];

    void initLetterLib(){
    *libraryLetters[0x20] = 0x000000000000; // Blank
    *libraryLetters['A'] =  0xFE909090FE00;
    *libraryLetters['H'] =  0xFE101010FE00;
    *libraryLetters['L'] =  0xFE0202020200;
    *libraryLetters['O'] =  0xFE828282FE00;
    *libraryLetters['U'] =  0xFE020202FE00;
    *libraryLetters['R'] =  0xFE9894946200;
    *libraryLetters['Z'] =  0x868A92A2C200;
    *libraryLetters['I'] =  0x0000FE000000;
    *libraryLetters['F'] =  0xFE9090808000;
}

    // takes a String and generates the outputsequence for LEDs
    unsigned char * stringToLEDText(char* textString)
    {
        static unsigned char outputLED[LED_STEPS];
        unsigned char i = 0; // index
        // check length of string text
        unsigned short length = strlen(textString);
        // if more than 10 letters are used return error
        if (length > LETTERS_LED_OUTPUT)
        {
            printf("Error: Too much letters. Just 10 Letters are allowed\n");
            return 0;
        }
        // through complete string
        for (i = 0; i < length; i++)
        {
    memcpy(&outputLED[i * LETTER_WIDTH], &(libraryLetters[textString[i]]),
                       LETTER_WIDTH);
            }
            // fills rest with 0
            for (i = length * LETTER_WIDTH; i < LED_STEPS; i++)
            {
            outputLED[i] = 0x00;
        }
        return outputLED;
    }

有什么想法吗?

谢谢 法比安

您将 letter 类型定义为 unsigned char ,它只包含一个字节,但随后您尝试存储一个 6 字节整数。所以如果你想使用任意长度的字母数组,你只能得到最后一个字节,它在你所有的字母中都是零。否则,如评论中所建议的那样,使用 64 字节类型会容易得多。

相反,您应该将字母添加为

libraryLetters['H'][0] = 0xFE;
libraryLetters['H'][1] = 0x90;
...

或者您可以按照 Ian Abbott 的建议使用 memcpy(libraryLetters['A'], letter_number, LETTER_WIDTH)

*libraryLetters[x]unsigned char 类型,您正试图为其分配一个超出 unsigned char.

范围的数字

您似乎在尝试将 6 个字节的序列分配给 *libraryLetters[x]。一种方法是使用 memcpy,例如:

memcpy(libraryLetters['A'], "\xFE\x90\x90\x90\xFE\x00", 6);

你的代码没有多大意义。首先,将数组隐藏在 typedef 后面并不是一个好主意。摆脱那个。

使用 C 的默认 "primitive data types" 也不是一个好主意,因为它们是非 portable 并且长度不同。而是使用 stdint.h 类型。这在嵌入式系统编程中几乎是强制性的做法。

至于实际问题,不能这样给数组赋值

*libraryLetters[0x20] = 0x000000000000;

这没有任何意义。您告诉编译器在 6 字节数组的第一个字节中存储一个 64 位整数。你可能想做的是:

const uint8_t letters [128][LETTER_WIDTH] =
{
  [0x20] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
  ['A']  = {0xFE, 0x90, 0x90, 0x90, 0xFE, 0x00};
  ...
};

假设这是一个用于某些显示的符号 table。如果是这样,它应该是 const 并在闪存中分配。