复制多维数组C.

时间:2017-05-04 09:13:19

标签: c microcontroller

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

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

我尝试将我的libraryLetter memcpy到我的outputLED中,但它不起作用。 我只是将0x00输入到outputLED中。 我试图在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;
    }

有什么想法吗?

由于 费边

3 个答案:

答案 0 :(得分:2)

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

使用C的默认“原始数据类型”也不是一个好主意,因为它们是不可移植的并且长度不同。而是使用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};
  ...
};

假设这是某些显示的符号表。如果是这样,它应该是const并在flash中分配。

答案 1 :(得分:0)

您将letter类型定义为unsigned char,它只保存一个字节,但之后您尝试存储一个6字节的整数。因此,如果您希望能够使用任意长度的字母数组,那么您只能获得最后一个字节,即所有字母中的零。否则,使用64字节类型会更容易,如评论中所示。

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

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

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

答案 2 :(得分:0)

*libraryLetters[x]属于unsigned char类型,您正试图在unsigned char范围之外为其指定一个数字。

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

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