- Labornetzteil AliExpress         
Seite 3 von 3 ErsteErste 123
Ergebnis 21 bis 26 von 26

Thema: Array-Alternative

  1. #21
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    37
    Beiträge
    1.225
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Ja drew, so war das gemeint. Folgender Code ist ungetestet, compiliert bei mir aber schon Mal:

    Code:
    #include <avr/io.h>
    #include <avr/pgmspace.h>
    #include <stdint.h>
    
    typedef uint16_t Frame_t[9];
    typedef struct {
        uint8_t frameCount;
        Frame_t * animation;
    } AnimationData_t;
    PROGMEM Frame_t Animation1[2] = { { 1, 2, 3, 4, 5, 6, 7, 8, 9 }, { 11, 12, 13,
            14, 15, 16, 17, 18, 19 } };
    PROGMEM Frame_t Animation2[1] = { { 21, 22, 23, 24, 25, 26, 27, 28, 29 } };
    
    AnimationData_t animations[2] = { { sizeof(Animation1), Animation1 }, {
            sizeof(Animation2), Animation2 } };
    
    int main(void) {
        for (uint8_t i = 0; i < sizeof(animations); i++) {
            for (uint8_t j = 0; j < animations[i].frameCount; j++) {
                Frame_t * frames = animations[i].animation;
                for (uint8_t k = 0; k < 9; k++) {
                    uint16_t frameWord;
    
                    frameWord = pgm_read_word(&frames[j][k]);
                }
            }
        }
    }
    Später kann über animations zur Laufzeit fast wie auf ein Array zugegriffen werden, dieser Code legt die eigentlichen Bitmuster bereits im Flash ab.

    mfG
    Markus
    Tiny ASURO Library: Thread und sf.net Seite

  2. #22
    Neuer Benutzer Öfters hier
    Registriert seit
    06.06.2011
    Beiträge
    16
    Danke, deine Lösung macht genau was ich gesucht habe

  3. #23
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    37
    Beiträge
    1.225
    Freut mich wenn es funktioniert, ich wollte den Code noch via Simulation überprüfen, musste aber feststellen dass Eclipse + avr-gdb + simulavr wohl nicht so meins ist und ich demnächst irgendwie AVR Studio über ne Windows-VM oder Wine zum laufen kriegen muss.
    Tiny ASURO Library: Thread und sf.net Seite

  4. #24
    Benutzer Stammmitglied
    Registriert seit
    09.05.2007
    Beiträge
    99
    Nein, nahe dran, aber so funktioniert das nicht denn mit sizeof() wird falsch umgegangen. Wird @zulakis wohl auch schon bemerkt haben. So will ich diesen Thread nicht enden lassen. (Schade auch, dass @markusj andere Typ- und Variablennamen eingesetzt hat. Das macht das gemeinsame arbeiten im Thread schwierig.) Ich habe mal alles zusammen gefasst und konnte Folgendes erfolgreich testen:
    Code:
    typedef uint16_t Frame_t[9];
    
    typedef struct {
      uint16_t NumberOfFrames; // Anzahl der Frames
    Frame_t * PointerToAnimation; // Pointer zum FrameArray
    } Animationen_t;
    
    PROGMEM Frame_t animation1[] ={{0,2,3,4,5,6,7,8,9}, {1,2,3,4,5,6,7,8,9}};
    PROGMEM Frame_t animation2[]={{3,2,3,4,5,6,7,8,9}};
    PROGMEM Animationen_t animations[] = {{2, animation1}, {1, animation2}};
    
    int main(void) {
    int i, j, k;
    for (i = 0; i < sizeof(animations)/sizeof(Animationen_t); i++) {
    for (j = 0; j < pgm_read_word(&animations[i].NumberOfFrames); j++) {
     Frame_t * frame = pgm_read_word(&animations[i].PointerToAnimation);
    for (k = 0; k < 9; k++) {
            uint16_t frameWord = pgm_read_word(&frame[j][k]);
            //printf("%d, ", frameWord);
          }
    }
    }
    }
    [ot]Sorry, mir fliegen hier im CODE immer die indent Spaces durcheinander. Was mach ich da falsch?[/ot]
    Geändert von rossir (03.01.2012 um 15:40 Uhr)

  5. #25
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    37
    Beiträge
    1.225
    Ouch, dämlicher Fehler. Du hast natürlich Recht, sizeof gibt mir die Größe in Bytes was erst Mal wenig bringt ...
    Ich hatte allerdings bewusst darauf verzichtet, die Indexstruktur im PROGMEM abzulegen, um unnötige Lesezugriffe auf den Flash (die das ganze verlangsamen und komplexer machen) zu vermeiden. Es wäre natürlich auch möglich, einfach immer nur den aktuell benötigten Index zu laden, dann hätte man alles im Flash liegen und dennoch einen effizienten Zugriff.
    Ach ja: GCC beschwert sich über Arrays deren Größe nicht bei der Definition angegeben wird ...

    mfG
    Markus

    PS: Auch wenn es ähnlich aussieht, ich hatte meinen Code einmal komplett neugeschrieben um alles (gut, bis auf sizeof *hust*) zu durchdenken, daher die Unterschiede.
    PPS: Wie kriegst du deinen Code eigentlich farbig? Geht das manuell oder macht das Forum das automagisch?
    Tiny ASURO Library: Thread und sf.net Seite

  6. #26
    Benutzer Stammmitglied
    Registriert seit
    09.05.2007
    Beiträge
    99
    Aaah, jetzt dämmert's mir. Danke @markusj. Die Farbigkeit des Codes habe ich immer als Feature der Forumsoftware angesehen. Ist aber nicht so! Sondern lag daran, dass ich den Code direkt aus Eclipse cut&paste! Dadurch kommt das syntaxcoloring von Eclipse mit ins Forum. Wenn ich das nicht tue (siehe Test unten) bleibt es schwarz/weiß. Und ... siehe da, mein indent Problem ist auch weg.
    Code:
    typedef uint16_t Frame_t[9];
    
    typedef struct {
      uint16_t NumberOfFrames; // Anzahl der Frames
      Frame_t * PointerToAnimation; // Pointer zum FrameArray
    } Animationen_t;
    
    PROGMEM Frame_t animation1[] ={{0,2,3,4,5,6,7,8,9}, {1,2,3,4,5,6,7,8,9}};
    PROGMEM Frame_t animation2[]={{3,2,3,4,5,6,7,8,9}};
    PROGMEM Animationen_t animations[] = {{2, animation1}, {1, animation2}};
    
    int main(void) {
      int i, j, k;
      for (i = 0; i < sizeof(animations)/sizeof(Animationen_t); i++) {
        for (j = 0; j < pgm_read_word(&animations[i].NumberOfFrames); j++) {
          Frame_t * frame = pgm_read_word(&animations[i].PointerToAnimation);
          for (k = 0; k < 9; k++) {
            uint16_t frameWord = pgm_read_word(&frame[j][k]);
            //printf("%d, ", frameWord);
          }
        }
      }
    }

Seite 3 von 3 ErsteErste 123

Ähnliche Themen

  1. LED Array
    Von filth im Forum Elektronik
    Antworten: 7
    Letzter Beitrag: 09.12.2008, 13:06
  2. Array
    Von infection im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 26.05.2008, 22:47
  3. Array auf zweidimensionale Array
    Von semicolon im Forum C - Programmierung (GCC u.a.)
    Antworten: 1
    Letzter Beitrag: 25.05.2007, 13:48
  4. globales Array
    Von Baila_me im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 0
    Letzter Beitrag: 15.08.2006, 10:40
  5. Nur Nummern in Array / nur Variablentyp byte als Array?
    Von Crashmichl im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 28.04.2006, 00:15

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress