Georg schrieb:
> vorgesehen ist das man die werte mittels taster und lcds verändern kann,
> daher weiss ich nicht ob ich es vielleicht auch auslagern könnte (
> PROGMEM ) und so wieder ein wenig speicherplatz einzusparen.
Nein.
Das geht nicht (zumindest nicht simpel)
PROGMEM ist für dein Programm als absolut konstant und unveränderlich
anzusehen. (Es gibt Ausnahmen, aber die sind sicherlich zu kompliziert).
Zum Problem:
Wenn du keine vernünftige Abschätzung machen kannst, bzw. mit dieser
Abschätzung nicht leben kannst, weil sie zuviel Speicher verbraucht,
dann wirst du wohl oder übel auf malloc/free ausweichen müssen, auch
wenn man das eigentlich nicht möchte.
Die Anzahl der Tage ist ja fix, so wie ich das sehe. Die Woche hat nun
mal nicht mehr als 7 Tage.
Also reicht es sich ein Array von 7 Pointern anzulegen, wobei jeder
Pointer auf ein dynamisch allokiertes Array von Werten zeigt. Und
natürlich muss es noch einen Mechanismus geben, der einem sagt, wieviele
Einträge zur Zeit gerade allokiert sind.
Also sowas
1 | struct Entry
|
2 | {
|
3 | uint8_t nrAllocated; // Anzahl momentan allokierter Einträge
|
4 | int* Values; // die Werte selber
|
5 | };
|
Davon brauchst du 7 Stück, für jeden WOchentag einen
Und du allokierst zb für Montag 3 Werte
1 | #define MONDAY 0
|
2 | #define TUESDAY 1
|
3 | #define WEDNESDAY 2
|
4 | #define THURSDAY 4
|
5 | #define FRIDAY 5
|
6 | #define SATURDAY 6
|
7 | #define SUNDAY 7
|
8 |
|
9 | void Init()
|
10 | {
|
11 | uint8_t i;
|
12 |
|
13 | for( i = 0; i < sizeof(Data)/sizeof(*Data); ++i ) {
|
14 | Data[day].Values = NULL;
|
15 | Data[day].nrAllocated = 0;
|
16 | }
|
17 | }
|
18 |
|
19 | uint8_t Allocate( uint8_t day, uint8_t nrValues )
|
20 | {
|
21 | struct Entry* newData = realloc( Data[day].Values, nrValues * sizeof( *Entry.Values ) );
|
22 |
|
23 | if( newData == NULL ) { // Out of memory
|
24 | // tja. Was soll jetzt geschehen
|
25 | return FALSE;
|
26 | }
|
27 |
|
28 | Data[day].Values = newData;
|
29 | Data[day].nrAllocated = nrValues;
|
30 |
|
31 | return TRUE;
|
32 | }
|
33 |
|
34 | int main()
|
35 | {
|
36 | Init();
|
37 |
|
38 | if( Allocate( MONDAY, 3 ) ) {
|
39 | // Allokierung erfolgreich
|
40 | Data[MONDAY].Values[0] = 28;
|
41 | Data[MONDAY].Values[1] = 56;
|
42 | Data[MONDAY].Values[2] = 178;
|
43 | }
|
44 |
|
45 | ....
|
46 |
|
47 | // Fuer Montag kommen noch 2 Werte dazu
|
48 | uint8_t sizeNow = Data[MONDAY].nrAllocated;
|
49 | if( Allocate( MONDAY, sizeNow + 2 ) ) {
|
50 | Data[MONDAY].Values[sizeNow] = 876;
|
51 | Data[MONDAY].Values[sizeNow + 1] = 23;
|
52 | }
|
53 |
|
54 | ...
|
55 |
|
56 | // Alle Werte für Montag
|
57 | for( i = 0; i < Data[MONDAY].nrAllocated; ++i )
|
58 | // mach was mit Data[MONDAY].Values[i]
|