复制多维数组 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
并在闪存中分配。
我是 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
并在闪存中分配。