我是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;
}
有什么想法吗?
由于 费边
答案 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);