2017-05-04 12 views
-2

私はCに新たなんだと私は動作しないいくつかのコードを作成し...コピー多次元配列C

initLetterLibは()しながら、私は警告を受ける:整数変換は、私がしようと切り捨て

の結果私のlibraryLetterをoutputLEDにmemcpyすることはできますが、動作しません。 私はoutputLEDに0x00を取得しました。 私は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

「0xFE0202020200」のような48ビット定数に使用する整数型(MCU)は何ですか?多分あなたの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

あなただけの1バイトを保持するが、その後、あなたは6バイトの整数を保存しようとしますunsigned charとしてあなたletterタイプを定義します。だから、あなたは文字配列の任意の長さを使用できるようにしたい場合は、すべての文字の中で最後のバイトを取得するだけです。それ以外の場合は、コメントに示唆されているように、64バイトのタイプを使用する方がはるかに簡単です。

代わりに、あなたは

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

として文字を追加する必要がありますまたは、イアン・アボットにより示唆されるように、あなたはmemcpy(libraryLetters['A'], letter_number, LETTER_WIDTH)を使用することができます。

0

*libraryLetters[x]は、タイプがunsigned charであり、unsigned charの範囲外の番号を割り当てようとしています。

*libraryLetters[x]に6バイトのシーケンスを割り当てようとしているようです。それを行う1つの方法は、例えば、memcpyを使用している:

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