Ich bin's noch mal, hi. Hab eine weiteren Frage zum Puffer und dessen Arbeitsweise. Hoffe, du kannst helfen.
Als Lern-Projekte möchte ich eine Steuerung für mein Gewächshaus programmieren (weiter unten ist mein bisheriges Listing), welches dann mit den nötigen Sensoren auf einem Raspberry Pico laufen soll.
Soll-Funktion:
In der manuellen Heizungs- und Luftsteuerung können sechs verschiedene An- und Auszeiten sowie max. und min. Temperatur eingeben werden . Nach der 6. Eingabe soll automatisch der Text "Ihre Einstellungen wurden gespeichert. Weiter mit Enter" erscheinen.
Ist-Funktion:
Ich muss bei "Heizung", " Manuelle Einstellung", zusätzlich nach dem Enter für die Eingabe der letzten Zahl der 6. Eingabe noch ein Enter eingeben, damit "Ihre Einstellungen wurden gespeichert" erscheint . Und dann noch ein Enter, damit "Weiter mit Enter" erscheint. Bei "Luft", "Manuelle Einstellung", muss ich gleich 2 x Enter nach der Eingabe der letzten Zahl beim 3. Ventilator eingeben.
Bei "Licht", "Manuelle Einstellung", funktioniert es einwandfrei. Da kann man gut sehen, wie es sein soll.
Zum testen:
Start des Codes. Im Menue die 1 für "Heizung" oder 3 für "Luft" eingeben, dann die 3 für "Manuelle Eingabe" und bei allen 6 Schaltungen beispielsweise Start-Zeit 2, Stopp-Zeit 3, Mindest-Temperatur 22, Maximal-Temperatur 23 eingeben bzw. bei allen 3 Schaltungen "Start-Zeit" 2 und "Stopp-Zeit" 3, dann tritt der Fehler auf.
Betroffen sind die Funktionen "void _heizung ()" und "void _luft". In den Zeilen 100 und 200 etwa habe ich den möglichen Fehlerbereich mit "FEHLER" markiert .
Ich denke, es hat wieder mit dem Puffer zu tun. Leider finde ich im Netz wenig spezifische Lektüre zu dem Thema. Ich würde gerne detailliert verstehen, was da passiert, damit ich irgendwann stabile Programme schreiben kann. Ein Lösungsvorschlag wäre auch toll. Zudem gerne Tipps und praktische Beispiele, wie ich den Puffer komplett verstehen kann.
while ((ch = getchar()) != '\n' && ch != EOF) (tue nichts); hab ich durch deinen letzten Tipp zum Löschen von Puffer gefunden. Damit wird alles im Puffer gelöscht, außer \n. Warum löscht man das nicht gleich mit? Wenn es stehen bleibt, stehen doch bei der nächsten Eingabe schon zwei \n im Puffer, oder? Und wie verhält es sich bei fgets (), wenn am Ende \n und \0 steht?
Danke für deine Mühe!
Edited by Xin: Codetags hinzugefügt
Code: Alles auswählen
#include <stdio.h>
#include <stdlib.h>
#define us unsigned short
void _heizung ();
us _eingabePruefungH (us *startzeitHeiz, us *stoppzeitHeiz, us *temperaturMin, us *temperaturMax);
void _licht ();
us _eingabePruefungLi (us *startzeitLicht, us *stoppzeitLicht);
void _luft ();
us _eingabePruefungLu (us *startzeitLuft, us *stoppzeitLuft);
us _menue ();
void _weiter ();
int main () {
us auswahl = 0;
char ch;
while (1) {
do {
printf("\n\n HAUPTMENÜ\n");
printf ("\n 1. Heizung");
printf ("\n 2. Licht");
printf ("\n 3. Luft");
printf ("\n 4. Ende");
printf("\n\n Geben Sie 1 - 4 ein und drücken Enter ");
if (ch=scanf("%d", &auswahl)==0)
getchar ();
} while (auswahl < 1 || auswahl > 4);
switch (auswahl) {
case 1:
_heizung ();
break;
case 2:
_licht ();
break;
case 3:
_luft ();
break;
case 4:
printf("\n\n Bis bald!");
exit (0);
default:
break;
}
}
return EXIT_FAILURE;
}
void _heizung () {
us ch, i = 0, menue = 0;
char jn;
us startzeitHeiz[6] = {0};
us stoppzeitHeiz[6] = {0};
us temperaturMin[6] = {0};
us temperaturMax[6] = {0};
printf ("\n\n HEIZUNG ");
menue = _menue ();
switch (menue) {
case 1:
printf("\n\n Die Automatik wurde aktiviert:");
printf("\n Die Tagestemperatur beträgt xy");
printf("\n Die Nachttemperatur beträgt xy");
//aktiviere die Automatik
_weiter ();
return;
case 2:
printf("\n\n Die Automatik wurde aktiviert:");
printf("\n Die Tagestemperatur beträgt xy");
printf("\n Die Nachttemperatur beträgt xy");
//aktiviere die Automatik
_weiter ();
return;
case 3:
printf("\n\n MANUELLE EINSTELLUNG");
printf("\n\n Geben Sie die Start- und Stoppzeit(en) und"
"\n den dazu gewünschten Temperaturbereich ein:");
do {
do {
printf("\n\n %d. Start-Zeit: ", i+1);
scanf("%d", &startzeitHeiz[i]);
printf(" %d. Stopp-Zeit: ", i+1);
scanf("%d", &stoppzeitHeiz[i]);
printf(" %d. Mindest-Temperatur: ", i+1);
scanf("%d", &temperaturMin[i]);
printf(" %d. Hoechst-Temperatur: ", i+1);
scanf("%d", &temperaturMax[i]);
ch = _eingabePruefungH (&startzeitHeiz[i], &stoppzeitHeiz[i], &temperaturMin[i], &temperaturMax[i]);
} while (ch == 1);
if (i < 5) {
printf("\n\n Sie können noch weitere Start-/Stoppzeiten eingeben.");
printf ("\n\n Weitere Eingaben mit (j), ansonsten (n): ");
i++;
}
while ((ch = getchar()) != '\n' && ch != EOF);
jn = getchar (); //scanf("%c", &jn);
} while (jn == 'j' && i < 6);
//aktiviere die manuelle Steuerung
//FEHLER: Ende i=6 muss zwei Mal Enter gedrückt werden
printf("\n Ihre Einstellungen wurden gespeichert\n");
i = 0;
while ((ch = getchar()) != '\n' && ch != EOF);
_weiter ();
//FEHLER: Hier muss noch mal Enter gedrückt werden
return;
default:
exit (0);
}
}
void _licht () {
us ch, menue = 0;
us startzeitLicht[1] = {0};
us stoppzeitLicht[1] = {0};
printf ("\n\n LICHT ");
menue = _menue ();
switch (menue) {
case 1:
printf("\n\n Die Automatik wurde aktiviert:");
printf("\n Die Beleuchtung erfolgt von xy");
//aktiviere die Automatik
_weiter ();
return;
case 2:
printf("\n\n Die Automatik wurde aktiviert:");
printf("\n Die Beleuchtung erfolgt von xy");
//aktiviere die Automatik
_weiter ();
return;
case 3:
do {
printf("\n\n MANUELLE EINSTELLUNG");
printf("\n\n Geben Sie die Start- und Stoppzeit (0 - 24) ein:");
printf("\n\n Start-Zeit: ");
scanf("%d", &startzeitLicht);
printf(" Stopp-Zeit: ");
scanf("%d", &stoppzeitLicht);
ch = _eingabePruefungLi (&startzeitLicht, &stoppzeitLicht);
} while (ch == 1);
//aktiviere die manuelle Steuerung
while( (ch = getchar()) != '\n' && ch != EOF );
printf("\n Ihre Einstellungen wurden gespeichert\n");
_weiter ();
return;
default:
exit (0);
}
return;
}
void _luft () {
us ch, i = 0, menue = 0;
char jn;
us startzeitLuft[3] = {0};
us stoppzeitLuft[3] = {0};
printf ("\n\n LUFT ");
menue = _menue ();
switch (menue) {
case 1:
printf("\n\n Die Automatik wurde aktiviert:");
printf("\n Der Ventilator läuft von xy");
//aktiviere die Automatik
_weiter ();
return;
case 2:
printf("\n\n Die Automatik wurde aktiviert:");
printf("\n Der Ventilator läuft durchgehend");
//aktiviere die Automatik
_weiter ();
return;
case 3:
printf("\n\n MANUELLE EINSTELLUNG");
printf("\n\n Geben Sie die Start- und Stoppzeit(en 0 - 24) ein:");
do {
do {
printf("\n\n %d. Ventilator", i+1);
printf("\n Start-Zeit (Steckdose %d): ", i+1);
scanf("%d", &startzeitLuft[i]);
printf(" Stopp-Zeit (Steckdose %d): ", i+1);
scanf("%d", &stoppzeitLuft[i]);
ch = _eingabePruefungLu (&startzeitLuft[i], &stoppzeitLuft[i]);
} while (ch == 1);
if (i < 2) {
printf ("\n\n Weiteren Lüfter zuschalten mit (j), ansonsten (n): ");
}
while ((ch = getchar()) != '\n' && ch != EOF);
jn = getchar (); //scanf("%c", &jn);
i++;
} while (jn == 'j' && i < 3);
//aktiviere die manuelle Steuerung
//FEHLER: Ende i=3 muss zwei Mal Enter gedrückt werden
while ((ch = getchar()) != '\n' && ch != EOF);
printf("\n Ihre Einstellungen wurden gespeichert\n");
i = 0;
_weiter ();
return;
}
}
us _menue () {
us menue, ch;
do {
printf ("\n\n 1. Automatik aktivieren "
"\n 2. Automatik aktivieren "
"\n 3. Manuelle Einstellung");
printf ("\n\n Geben Sie 1, 2 oder 3 ein und drücken Enter ");
while( (ch = getchar()) != '\n' && ch != EOF );
if ((ch=scanf("%d", &menue)) == 0);
getchar ();
} while (menue < 1 || menue > 3 || ch == 0);
return menue;
}
void _weiter () {
printf ("\n\n Weiter mit Enter");
if (getchar () == "\n")
return;
}
us _eingabePruefungH (us *startzeitHeiz, us *stoppzeitHeiz, us *temperaturMin, us *temperaturMax) {
if (*startzeitHeiz >= 0 && *startzeitHeiz <= 24) {
if (*stoppzeitHeiz >= 0 && *stoppzeitHeiz <= 24) {
if (*startzeitHeiz != *stoppzeitHeiz) {
if (*temperaturMin >= 18 && *temperaturMin <= 28) {
if (*temperaturMax >= 20 && *temperaturMax <=30) {
if (*temperaturMin < *temperaturMax) {
return 0;
}
}
}
}
}
}
printf("\n Uuups, da war was falsch, bitte erneut eingeben.\n");
return 1;
}
us _eingabePruefungLi (us *startzeitLicht, us *stoppzeitLicht) {
if (*startzeitLicht >= 0 && *startzeitLicht <= 24) {
if (*stoppzeitLicht >= 0 && *stoppzeitLicht <= 24) {
if (*startzeitLicht != stoppzeitLicht) {
return 0;
}
}
}
printf("\n Uuups, da war was falsch, bitte erneut eingeben.\n");
return 1;
}
us _eingabePruefungLu (us *startzeitLuft, us *stoppzeitLuft) {
if (*startzeitLuft >= 0 && *startzeitLuft <= 24) {
if (*stoppzeitLuft >= 0 && *stoppzeitLuft <= 24) {
if (*startzeitLuft != *stoppzeitLuft) {
return 0;
}
}
}
printf("\n Uuups, da war was falsch, bitte erneut eingeben.\n");
return 1;
}