Forum: Compiler & IDEs Initialisierung eines structs mit Pointer -Element


von Tim (Gast)


Lesenswert?

Hallo,

um möglichst Flexible zu sein, möchte ich das Element pTimeout im struct 
sTimer während der Laufzeit ändern können. Der Initialwert des Objekts 
sTimerData steht im Flash und wird beim starten ins RAM sTimerData_Ram 
geladen. Mit Hilfe eines Pointers psTimerData zeige ich auf die Adresse 
von sTimerData_Ram.

Der Code lässt sich so nicht kompilieren. Es wird angemeckert, dass 
"&(psTimerData->Timeout1)" nicht const ist. Nehme ich die variable 
sTimerData_Ram gibt es keine Probleme. In beiden Fällen übergebe ich 
jedoch einen Pointer. Warum klappt meine Vorgehensweise nicht? Liegt es 
dadran das dem Pointer noch keine Adresse zu gewiesen worden ist?

Vielen Dank.
1
T_TIMER sTimer[2] =
2
{
3
   { &Counter1, &(sTimerData_Ram.Timeout1) },
4
   { &Counter2, &(sTimerData_Ram.Timeout2) }
5
};
6
7
#include<stdio.h>
8
9
typedef struct
10
{
11
    unsigned char Timeout1;
12
    unsigned char Timeout2;
13
}T_TIMER_DATA;
14
15
typedef struct
16
{
17
    unsigned char *pCounter;
18
    unsigned char *pTimeout;
19
}T_TIMER;
20
21
static unsigned char Counter1;
22
static unsigned char Counter2;
23
24
25
const static T_TIMER_DATA sTimerData = { 100 ,10 };
26
27
T_TIMER_DATA sTimerData_Ram;
28
T_TIMER_DATA *psTimerData;
29
30
T_TIMER sTimer[2] =
31
{
32
   { &Counter1, &(psTimerData->Timeout1) },
33
   { &Counter2, &(psTimerData->Timeout2) }
34
};
35
36
37
int main()
38
{
39
    /*Copy from Flash to RAM*/
40
    sTimerData_Ram = sTimerData;
41
    
42
    psTimerData = &sTimerData_Ram;
43
}

--

Mit den [ c ] [ /c ] - Tags wirds lesbarer.
-rufus

: Bearbeitet durch User
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Tim schrieb:
> Es wird angemeckert, dass "&(psTimerData->Timeout1)" nicht const ist.

psTimerData ist ein nicht initialisierter Pointer, der ins Nirvana 
zeigt. Erst in main() weist Du dem Ding einen Wert zu; Deine globale 
Variable aber willst Du mit einer Dereferenzierung dieses (nicht 
initialisierten) Pointers initialisieren.

Und ja, natürlich ist das nicht const, weil Du psTimerData nicht const 
definierst.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.