Forum: Mikrocontroller und Digitale Elektronik Nach while kein Inhalt mehr im Array?


von Draeste (Gast)


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?

: Verschoben durch Moderator
von g457 (Gast)


Lesenswert?

> Kann mir jemand helfen?

Wahrscheinlich. Zeig doch mal den Code.

von N. M. (mani)


Lesenswert?

Das wichtigste fehlt.
Wo sind die Variablen definiert?
Was für Typen haben sie?
Wie erkennst du dass sie angeblich 0 sind?
Von wo aus wird der gezeigte Code aufgerufen?
Werden die Variablen in einem Interrupt verwendet?

von DerEinzigeBernd (Gast)


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?)

von Draeste (Gast)


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.

von Teo D. (teoderix)


Lesenswert?

Zeig deinen Code (als Anhang!), sonst wird das nichts!

von DPA (Gast)


Lesenswert?

Ist counter_ms volatile?

von Draeste (Gast)


Lesenswert?

DPA schrieb:
> Ist counter_ms volatile?

Nein war sie nicht, hat aber auch keine Änderung bewirkt.


Teo D. schrieb:
> Zeig deinen Code (als Anhang!), sonst wird das nichts!

Kann ich später machen, bin aktuell nicht an dem PC auf dem die Datei 
ist.

von Draeste (Gast)


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 !

von (prx) A. K. (prx)


Lesenswert?

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

Weil undefiniertes Verhalten nicht reproduzierbar sein muss?

: Bearbeitet durch User
von WF88 (Gast)


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, ...

von (prx) A. K. (prx)


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.

: Bearbeitet durch User
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.