Nach while kein Inhalt mehr im Array?

Gast #7221954
Lesenswert?

Servus,

ich habe ein kleines Problem.
Ich befülle in einer while Schleife ein Array mit einer aktuellen 
Zeitvariable.
Danach möchte ich die Variable abfragen. Allerdings ist, sobald ich die 
while verlasse die Variable 0 ...
Innerhalb der while funktioniert die Abfrage noch..


Code ist folgendermaßen aufgebaut:
1
while (count < 4)
2
{
3
   if(PINC & 0x30 && active_led != 1)
4
    {
5
      active_led = 1;
6
      result_time[count] = counter_ms;
7
      count++;
8
    }
9
 // Pos 1
10
}
11
// Pos 2

Abfragen des Arrays result_time[]:
1
if(result_time[1] > var)
2
{
3
   bla
4
}

Wenn ich an Pos 1 die Abfrage setze klappt das ganze wunderbar, frage 
ich nach der while ab Pos 2 ab, ist der Wert im Array < 1 
(wahrscheinlich 0?).


Kann mir jemand helfen?
Gast #7222062
Lesenswert?

Draeste schrieb:
> Code ist folgendermaßen aufgebaut:
>   while (count < 4)


Und welchen Wert hat "count", bevor es losgeht? Ist das initialisiert, 
oder enthält es Zufallswerte?

Wie ist "result_time" definiert?

Welche zu erwartenden Werte liefert "counter_ms"?

Wie ist das definiert? (Welcher Datentyp?)
Gast #7222122
Lesenswert?

Der Code ist relativ lang, deswegen hab ich das (für mich vermeindlich) 
wichtigste raus getippt.

Die Variablen sind ganz am Anfang, vor der main() Funktion definiert.
(count könnte ich wahrscheinlich auch in der Funktion deklarieren, hab 
ich aber geändert, um Fehler auszuschließen)
1
uint32_t result_time[4];
2
uint16_t count = 0;

Der Code wird aufgerufen in der while(1) nach der initialisierung von 
ADC, Timer, sei() usw.

counter_ms wird tatsächlich im Compare Interrupt des Timers benutzt und 
dort bei jedem Interrupt (alle 1 ms) um 1 erhöht.
Vor der Schleife wird diese Variable auf 0 zurückgesetzt um während des 
Tests einen Overflow zu vermeiden.
Somit sind die zu erwartenden Werte zwischen 200 und maximal 5000.

Wie ich erkenne dass die Variable nach der while (ab Pos 2) 0 (oder 
negativ) ist, ist dass die Abfrage mit
1
if (result_time[0] < 1)
funktioniert.
Gast #7222152
Lesenswert?

DPA schrieb:
> Ist counter_ms volatile?


Ja das hat tatsächlich eine Änderung bewirkt, hab mich geirrt...

Aber wieso ändert es die Variable in der while() und nach der while ist 
sie wieder 0??

Danke erstmal für die Hilfe, das hat mir viel weitergeholfen !
Gast #7222179
Lesenswert?

(prx) A. K. schrieb:
> Draeste schrieb:
>
>> Aber wieso ändert es die Variable in der while() und nach der while ist
>> sie wieder 0??
>
> Weil undefiniertes Verhalten nicht definiert reproduzierbar ist.

In anderen Worten: wenn etwas nicht definiert ist, kann der compiler 
machen was er will. Es kommt u.A. auch auf den Kontext im Programm an, 
wasda passiert. Er darf Speicher wiederverwenden, "freigeben", 
unangetastet liegen lassen + neuen Speicherbereich nutzen, ...
#7222184
Lesenswert?

Erklärbar ist ein unterschiedliches Verhalten des Compilers jedoch auch 
jenseits davon. In (1) wird bei count <= 1 auf die Variable schon 
zugegriffen, bevor sie überhaupt in diesem Code geschrieben wurde. Es 
gibt also mehrere mögliche Werte. Punkt (2) hingegen wird erst erreicht, 
wenn sie sicher mit dem sich für den Compiler nicht verändernden Wert 
geschrieben wurde, d.h. es gibt nur einen möglichen Wert.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren