State machine

Hallo Freunde
habe ein kleines Problem.
Es wird in meinem Program nicht zum “case Second:” gesprungen.
und ich meine ich habe meine Meinung nach alles richtig gemacht.
wäre nett von euch, mir da tipps zu geben.
Viele Grüße

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <stdint.h>

bool Year[8];
bool ParityDateData[4];

enum CASE { First, Second, Third, Fourth, Fifth, sixth };
uint8_t state = First;
int i = 0;
int Rest;

void Get_Year(int n);
void sort(bool Value[], int n);
int main()
{
	int n = 75;
	Get_Year(n);
	for (i = 0; i < 8; i++)
		printf("%d\n", Year[i]);
	return 0;
}
bool Check_parity(bool value[], int count) {
	int Number_Of_Ones = 0;
	for (i = 0; i < count; i++) {
		if (value[i] == true)
			++Number_Of_Ones;
	}
	if (Number_Of_Ones & 1) // ungerade
		return true;
	else
		return false;
}

void Get_Year(int n) {
	sort(Year, n);
	ParityDateData[3] = Check_parity(Year, 8);
}

void sort(bool Value[], int n) {
	switch (state) {
	case First:
		if (n < 80) {
                        Rest = n;
			state = Second;
		}
		else {
			Value[7] = true;
			Rest = n - 80;
			if (Rest == 0)
				return;
			if (Rest == 1) {
				Value[0] = true;
				return;
			}
			if (Rest == 2) {
				Value[1] = true;
				return;
			}
			if (Rest == 4) {
				Value[2] = true;
				return;
			}
			if (Rest == 8) {
				Value[3] = true;
				return;
			}
			if (Rest == 10) {
				Value[4] = true;
				return;
			}
			if (Rest == 20) {
				Value[5] = true;
				return;
			}
			if (Rest == 40) {
				Value[6] = true;
				return;
			}
			if (Rest > 40)
				state = Second;
			else if (Rest > 20)
				state = Third;
			else if (Rest > 10)
				state = Fourth;
			else if (Rest > 8)
				state = Fifth;
			else if (Rest > 4)
				state = sixth;
			else if (Rest > 2)
				Value[1] = true;
			Value[0] = true;
			return;
		}
		break;

	case Second:
		Rest = Rest - 40;
		Value[6] = true;
		if (Rest == 0)
			return;
		if (Rest == 1) {
			Value[0] = true;
			return;
		}
		if (Rest == 2) {
			Value[1] = true;
			return;
		}
		if (Rest == 4) {
			Value[2] = true;
			return;
		}
		if (Rest == 8) {
			Value[3] = true;
			return;
		}
		if (Rest == 10) {
			Value[4] = true;
			return;
		}
		if (Rest == 20) {
			Value[5] = true;
			return;
		}
		if (Rest > 20)
			state = Third;
		else if (Rest > 10)
			state = Fourth;
		else if (Rest > 8)
			state = Fifth;
		else if (Rest > 4)
			state = sixth;
		else if (Rest > 2)
			Value[1] = true;
		Value[0] = true;
		return;
		break;

	case Third:
		Rest = Rest - 20;
		Value[5] = true;
		if (Rest == 0)
			return;
		if (Rest == 1) {
			Value[0] = true;
			return;
		}
		if (Rest == 2) {
			Value[1] = true;
			return;
		}
		if (Rest == 4) {
			Value[2] = true;
			return;
		}
		if (Rest == 8) {
			Value[3] = true;
			return;
		}
		if (Rest == 10) {
			Value[4] = true;
			return;
		}
		if (Rest > 10)
			state = Fourth;
		else if (Rest > 8)
			state = Fifth;
		else if (Rest > 4)
			state = sixth;
		else if (Rest > 2)
			Value[1] = true;
		Value[0] = true;
		return;

		break;

	case Fourth:
		Rest = Rest - 10;
		Value[4] = true;
		if (Rest == 0)
			return;
		if (Rest == 1) {
			Value[0] = true;
			return;
		}
		if (Rest == 2) {
			Value[1] = true;
			return;
		}
		if (Rest == 4) {
			Value[2] = true;
			return;
		}
		if (Rest == 8) {
			Value[3] = true;
			return;
		}
		if (Rest > 8)
			state = Fifth;
		else if (Rest > 4)
			state = sixth;
		else if (Rest > 2)
			Value[1] = true;
		Value[0] = true;
		return;
		break;

	case Fifth:
		Rest = Rest - 8;
		Value[3] = true;
		if (Rest == 0)
			return;
		if (Rest == 1) {
			Value[0] = true;
			return;
		}
		if (Rest == 2) {
			Value[1] = true;
			return;
		}
		if (Rest == 4) {
			Value[2] = true;
			return;
		}
		if (Rest > 4)
			state = sixth;
		else if (Rest > 2)
			Value[1] = true;
		Value[0] = true;
		return;
		break;

	case sixth:
		Rest = Rest - 4;
		Value[2] = true;
		if (Rest == 0)
			return;
		if (Rest == 1) {
			Value[0] = true;
			return;
		}
		if (Rest == 2) {
			Value[1] = true;
			return;
		}
		if (Rest > 2)
			Value[1] = true;
		Value[0] = true;
		return;
		break;

	}

}

Es wird in meinem Program nicht zum "case Second:" gesprungen.

Nach eingehender Prüfung des Quellcodes, von dem ich sagen muss, dass er mir seltsam konfus erscheint.....

Bin ich auf folgende Erkenntnis gestoßen:

Der Case Second wird nie wirksam, weil die Funktion nur einmal aufgerufen wird.

noiasca:
tja, woher weist du, dass rest mal größer 40 wird?

In anderen Worten:
Nutze die Serielle Schnittstelle und gibt dir aus wo dein Sketch ist, und was deine wichtigen Variablen gerade machen.

das Problem ist, es kommt nicht mal soweit um die Bedingung zu prüfen,
es verlässt direkt das Switch Block nach dem First case;
und das sollte er nicht

das Problem ist, es kommt nicht mal soweit um die Bedingung zu prüfen,

Das weiß ich doch schon lange.
"Wenn du mir damit sagen möchtest, dass ich ein Dummkopf bin, dann bist du damit, bei mir genau an der richtigen Adresse!"
:sunglasses: :sunglasses: :sunglasses:

es verlässt direkt das Switch Block nach dem First case;
und das sollte er nicht

Wieso nicht....?
Wenn du doch da ein break und/oder return hin malst...
Was meinst du denn wohl, was die beiden bewirken?

Übrigens ist es gar kein Arduino Problem, sondern kann --so wie es ist-- in jeder normalen Programmierumgebung per Debugger durchgesteppt werden.
Dann sieht man sofort, was combie uns sagen wollte.

Was das Ganze soll, ist mir allerdings nicht klar.
Ich stimme nicht immer mit combies Urteilen überein, aber "seltsam konfus" finde ich zur Zeit eine sehr treffende Beschreibung.

ja stimmt, ich habe ihn jz ein paar mal laufen lassen, jz klappt es.
das Programm soll einfach gelieferte Zeitinformationen von der Time library (z.B. die anzahl der vergangenen Jahren seit 1970 ) in DFC77 Uhren verständlichen Informationen umwandeln. Jedes "true" wird nachher in 200ms Impulse umgewandelt und jedes "false " in 100ms.
dann werde ich die Impulse an eine Funkuhr senden, um sie somit zu programmieren.
das Programm ist noch unvollständig.