2017-05-04 47 views
-2

我是新的C和我创造了一些代码,不工作...复制多维列C

我得到一个警告,而initLetterLib():整数转换导致截断

我尝试memcpy我的libraryLetter到我的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

你期望使用什么整数类型(MCU)来处理48位常量,比如0xFE0202020200?也许你的MCU是64位的?将'letter'类型定义为'int64'或类似的64位'long',而不是数组。否则,你不能完成任务。 – i486

+3

您的代码格式和缩进遍布整个地方。请[编辑]并修复它。 – user694733

回答

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并分配在闪存中。

0

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

相反,你应该添加字母

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

或者你可以使用memcpy(libraryLetters['A'], letter_number, LETTER_WIDTH)由伊恩·雅培的建议。

0

*libraryLetters[x]unsigned char类型和你想的一些分配给它的unsigned char的范围之外。

它看起来像你试图分配一个6字节的序列*libraryLetters[x]。要做到这一点的方法之一是使用memcpy,例如:

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