???Zitat:
.. ist schon zur Compilezeit fest und wird in den PROGMEM geschrieben
Warum dann nochmal in den SRAM ?
Druckbare Version
???Zitat:
.. ist schon zur Compilezeit fest und wird in den PROGMEM geschrieben
Warum dann nochmal in den SRAM ?
Dann verstehe ich dein Problem nicht. Du kannst doch einfach mehrere Arrays mit genau der benötigten Länge im Flash ablegen und über Präprozessormakros, Konstanten oder sizeof (sollte auch gehen) auf die Länge des jeweiligen Arrays zugreifen. Wenn du ganz strukturiert rangehen willst, machst du dir eine Datenstruktur aus einem uint8 (Länge der Animation) + einem Pointer auf ein PROGMEM-Array und erzeugst ein Array aus solchen Strukturen, dann kannst du wieder über einen Index auf die jeweilige Animation zugreifen, erhältst die Länge + einen Zeiger auf die Animationsdaten und kannst all das Wissen dann zur Weiterverarbeitung der Daten nutzen.
mfG
Markus
Hi,
wie wäre es, wenn Du das ganze Stück für Stück aufbaust?
Erst brauchst Du eine Struktur in der steht wieviele Frames die Animation hat und einen Zeiger auf die Frames:
Wenn Du die Frames einzeln ablegst:Code:typedef struct
{
uint16_t NumberOfFrames; // Anzahl der Frames
uint16_t * PointerToFrame; // Pointer zum FrameArray
} Frame;
und jetzt so was anlegest:Code:uint16_t Frame1[20]={1,2,3,4,5,...};
uint16_t Frame2[100]={1,2,3,4,5,...};
...
solltest Du über MeineFrames auf alles zugreifen, was Du brauchst.Code:Frame MeineFrames[5] = {{20,Frame1},{100,Frame2},...};
Ich hoffe, dass ich nicht all zu wirr klinge...
Drew
Ps: Ich glaube das ist das was markusj meint, oder?
Frames einzeln ablegen würde ich ungern machen, da das dann sehr schnell unübersichtlich wird.
Ginge es auch so, dass ich Animationen einzeln ablege?
Edit:
Ich habe jetzt folgendes:
Funktioniert zwar, ist aber seehr suboptimal weil ich jeden Frame einzeln anlegen muss und nicht einfach {{1,2,3},{1,2,3}} nutzen kann. Gibt es irgendeine Möglichkeit das ich die Frames gleich als {{},{}} in eine Animation kriege?Code:typedef struct
{
uint16_t * PointerToFrame; // Pointer zum FrameArray
} Frame;
uint16_t Frame1[5]={1,2,3,4,5};
uint16_t Frame2[5]={1,2,3,4,5};
Frame Animation1[2] = {Frame1,Frame2};
Frame Animation2[2] = {Frame1,Frame2};
typedef struct
{
Frame * PointerToFrame; // Pointer zum FrameArray
} AnimationStack;
AnimationStack Animations[2] = { Animation1, Animation2};
Schade, dass Du Deinen letzten Weg (ver-)editiert hast. Darauf aufbauend wäre das meine Vorschlag:
Code:typedef uint16_t Frame[9];
typedef struct
{
uint16_t NumberOfFrames; // Anzahl der Frames
Frame * PointerToAnimation; // Pointer zum FrameArray
} Animationen;
uint16_t Animation1[][9]={{0,2,3,4,5,6,7,8,9}, {1,2,3,4,5,6,7,8,9}};
uint16_t Animation2[][9]={{3,2,3,4,5,6,7,8,9}};
Animationen Animations[2] = {{2, &Animation1}, {1, &Animation2}};
Ahh, verdammt ;-)
Ich bekomme bei deinem Vorschlag leider folgende Fehler:
Sieht ansonsten aber genau nach dem aus was ich versuche hinzukriegen!Code:cmd:30: error: cannot convert 'uint16_t (*)[2][9]' to 'uint16_t (*)[9]' in initialization
cmd:30: error: cannot convert 'uint16_t (*)[1][9]' to 'uint16_t (*)[9]' in initialization
Schade.
Vielleicht müssen wir mal Compilerversionen austauschen. Zunächst, bei mir liegt der Code in einer C-Datei (nicht C++-Datei).
1) Microsoft Visual C++ 2005.
2) WinAVR-20100110
a) bei mir funktioniert es mit beiden oben genannten Compilern.
b) auch folgende Variante funktioniert damit:
Code:uint16_t Animation1[2][9]={{0,2,3,4,5,6,7,8,9}, {1,2,3,4,5,6,7,8,9}};
uint16_t Animation2[1][9]={{3,2,3,4,5,6,7,8,9}};
Animationen Animations[2] = {{2, Animation1}, {1, Animation2}};
Hmm, ich benutze das Standard Arduino-IDE (http://www.arduino.cc/en/Main/Software), welches laut http://www.arduino.cc/en/Hacking/BuildProcess mit dem avr-gcc compiled.