2017-05-04 4 views
-2

Ich bin neu in C und ich schuf einige Code, der nicht funktioniert ...Kopie mehrdimensionales Array C

erhalte ich eine Warnung während initLetterLib(): integer Umwandlung

in Abschneiden führte ich versuche, meinen libraryLetter in meine AusgabeLED memcpy, aber es funktioniert nicht. Ich bekomme nur 0x00 in meine AusgabeLED. Ich habe versucht, etwas anderes in AusgabeLED zu kopieren - das hat wirklich gut funktioniert. Aber ich nicht bekommen, warum ein Problem mit meinem libraryLetters gibt es ...

#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; 
    } 

Irgendwelche Ideen?

Dank Fabian

+0

Welchen Integer-Typ verwenden Sie (die MCU) für eine 48-Bit-Konstante wie '0xFE0202020200'? Vielleicht ist Ihre MCU 64-Bit? Definieren Sie den Typ "Buchstabe" als "int64" oder ähnliches 64-Bit "lang", nicht als Array. Andernfalls können Sie die Zuweisungen nicht ausführen. – i486

+3

Ihr Code Formatierung und Einrückung ist überall. Bitte [bearbeiten] und beheben Sie es. – user694733

Antwort

2

Ihr Code macht nicht viel Sinn machen. Das Verstecken eines Arrays hinter einem Typedef ist zunächst keine gute Idee. Werd das Los.

Die Verwendung der standardmäßigen "primitiven Datentypen" von C ist ebenfalls keine gute Idee, da diese nicht portabel sind und unterschiedliche Länge haben. Verwenden Sie stattdessen die stdint.h Typen. Dies ist bei der Embedded-System-Programmierung ziemlich zwingend erforderlich.

Was das eigentliche Problem, man kann nicht ein Array wie diese

*libraryLetters[0x20] = 0x000000000000;

zuweisen Das macht keinen Sinn. Sie weisen den Compiler an, eine 64-Bit-Ganzzahl im ersten Byte Ihres 6-Byte-Arrays zu speichern. Was Sie wahrscheinlich tun sollten, ist dies:

const uint8_t letters [128][LETTER_WIDTH] = 
{ 
    [0x20] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; 
    ['A'] = {0xFE, 0x90, 0x90, 0x90, 0xFE, 0x00}; 
    ... 
}; 

Angenommen, das ist eine Symboltabelle für einige Anzeige. Wenn ja sollte es const sein und im Flash zugewiesen werden.

0

Sie definieren Ihre letter Typ als unsigned char, die nur ein einziges Byte halten, aber dann versuchen Sie eine 6-Byte-Ganzzahl zu speichern. Sie erhalten also nur das letzte Byte, das in allen Ihren Briefen Null ist, wenn Sie eine beliebige Länge des Buchstabenfeldes verwenden wollen. Ansonsten ist es viel einfacher, einen 64-Byte-Typ zu verwenden, wie in den Kommentaren vorgeschlagen.

Stattdessen sollten Sie die Buchstaben als

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

hinzufügen Oder Sie könnten memcpy(libraryLetters['A'], letter_number, LETTER_WIDTH) verwenden, wie von Ian Abbott vorgeschlagen.

0

*libraryLetters[x] ist vom Typ unsigned char und Sie versuchen, eine Nummer außerhalb des Bereichs einer unsigned char zuzuweisen.

Es sieht so aus, als ob Sie versuchen, eine Sequenz von 6 Bytes *libraryLetters[x] zuzuweisen. Eine Möglichkeit, das zu tun, wird mit memcpy, zum Beispiel:

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