Forum: Mikrocontroller und Digitale Elektronik Pointer als Member einer Struktur - danach Zuweisungsprobleme


von Markus (Gast)


Lesenswert?

Hallo,
Ich komm einfach nicht mehr weiter.
Ich hab eine Struktur OS_Timer mit einem Pointer (Flagx).
In der Funktion OS_TimerSet übergebe ich die Adresse eines Flags 
(_timer->Flagx = p_flag;) was auch funktioniert.
Dann möchte ich in der "Timerroutine" dem Flag direkt den Wert 0 oder 1 
zuweisen. Nur leider spielts das nicht. Entweder der zugewiesene Wert 
bewirkt gar nichts oder wird als Adresse verwendet, wo er dann eben 
irgendwo und nicht mehr auf mein flag[0] zeigt.
Habe schon alle möglichen Casts probiert, nur leider kein Erfolg.
Wie kann man denn folgendes verstehen:
timer[i].Flagx = 1;
laut meinen Debugging Sessions wird 1 als neue Adresse gesehen.
Ich möchte "1" aber als Wert an die Adresse übergeben, auf die der 
Pointer bereits zeigt.
Wo liegt mein Fehler???

Danke
Max
1
typedef struct  
2
{
3
  uint8_t TimerStartStopBit;
4
  uint16_t TimerActualValue;
5
  uint16_t TimerCompareValue;
6
  uint8_t *Flagx;
7
}
8
OS_TIMER;
9
10
uint8_t flag[1];
11
12
13
OS_TIMER timer[1];
14
15
uint8_t OS_TimerSet(OS_TIMER *_timer, uint8_t *p_flag, uint16_t timerValue)
16
{
17
  _timer->TimerCompareValue = timerValue;
18
  _timer->Flagx = p_flag;
19
  return 0;
20
}
21
22
23
uint8_t TimerRoutine(void)
24
{
25
int i=0;
26
  
27
for(i=0;i<OSCFG_MaxTimer;i++)
28
{
29
if (timer[i].TimerStartStopBit == 1)
30
{
31
   timer[i].TimerActualValue++;
32
      
33
   if (timer[i].TimerActualValue == timer[i].TimerCompareValue)
34
   {
35
     timer[i].Flagx = 1;
36
     timer[i].TimerActualValue = 0;
37
   }
38
}
39
else
40
  {
41
    timer[i].TimerActualValue = 0;
42
  }
43
}
44
45
return 0;
46
}

von P. S. (Gast)


Lesenswert?

Markus wrote:

> Wo liegt mein Fehler???

Der Pointer muss dereferenziert werden, das macht man mit einem 
vorangestellten *. Also:

*( timer[i].Flagx) = 1;

Deswegen ist es wichtig C aus einem guten Buch zu lernen, statt aus 
Beispielen. Was ein Pointer ist und wie Pointerarithmetik funktioniert, 
muss sitzen - so schwer ist das aber eigentlich nicht.

von Volker Z. (vza)


Lesenswert?

1
*timer[i].Flagx = 1;

wie wäre es mal mit Bücher lesen oder mit :
http://home.fhtw-berlin.de/~junghans/cref/CONCEPT/pointers.html

von Markus (Gast)


Lesenswert?

Ich würde gern antworten, leider verwehrt mir das Forum meine antworten 
abzusenden.
Max

von Markus (Gast)


Lesenswert?

Verdammt das nimmts

von Markus (Gast)


Lesenswert?

Hab ich schon versucht nur hab ich es im AVR Studio übersehen.
Am Oszi funktioniert es.
Gute Bücher hab genug:-)
Der Tip mit dem lesen wär mir nicht eingefallen:-(
Max

von Markus (Gast)


Lesenswert?

Also nochmal:
Beim debuggen bin ich mit "run to cursor" über die Stelle drüber 
gefahren.
Hab im watchwindow das natürlich nicht gesehen, dass das Flag geschaltet 
wird.
Hätte ich das Oszi früher angeschlossen wär ich selbst draufgekommen.

Danke,
Max

von P. S. (Gast)


Lesenswert?

Markus wrote:

> Der Tip mit dem lesen wär mir nicht eingefallen:-(

Haettest du deine guten Buecher gelesen, haettest du weder mit dem 
Debugger, noch mit wilden Casts rumgespielt. Du entwickelst nicht, du 
bastelst rum - aber offensichtlich brauchst du gar keinen Rat.

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.