Pointer als Member einer Struktur - danach Zuweisungsprobleme

Gast #1191864
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
}
Gast
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.
Gast
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
Gast
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
Gast
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.