Forum: Compiler & IDEs Frage zu Artikel Funktionszeiger_in_C


von Peter S (Gast)


Lesenswert?

Hallo,

ich habe mir den Artikel zu Funktionszeigern durchgelesen.
http://www.mikrocontroller.net/articles/Funktionszeiger_in_C

Kann es sein dass bei dem Beispiel ganz unten bei Menüs mit 
Funktionszeigern ein while fehtl?

Oder soll das dort keine do-while Schleife sein?

Tut mir Leid wenn die Frage evtl. zu blöde ist, aber ich bin noch 
Anfänger und versuche mich gerade in das Thema einzuarbeiten.

Danke

von Detlef K. (adenin)


Lesenswert?

1
while(1)
2
{}
Das ist eine Endlosschleife.

von Peter (Gast)


Lesenswert?

Du hast recht. In der Funktion DoMenu fehlt das while, das do mit den 
Klammern steht ja da.

von Detlef K. (adenin)


Lesenswert?

ups,jetzt hab ich's auch gesehen was du meinst. ^^

von Peter S (Gast)


Lesenswert?

Welche Bedingung müsste dann in die while Schleife?
Eine Endlosschleife ist es ja wie ich denke nicht, oder?

Danke

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Doch, das dürfte eine Endlosschleife sein sollen.

Die while -Schleife (und also die Funktion DoMenu) wird durch das 
return -Statement (nach Eingabe von 9) verlassen.

Also sollte sie so aussehen:
1
void DoMenu (int NrEntries, struct MenuEntry Menu[])
2
{
3
  int i;
4
  int Auswahl;
5
 
6
  do
7
  {
8
    // ...
9
    // weggelassen
10
    // ...
11
  }
12
  while (1);
13
}

: Bearbeitet durch User
von Peter S (Gast)


Lesenswert?

Vielen Dank für den Hinweis, das Return als Abbruchbedingung habe ich
wohl übersehen.

Ist dieser Ansatz für ein Menü welches auf einem Display angezeigt
werden soll empfehlenswert?

Danke

von Karl H. (kbuchegg)


Lesenswert?

Peter S schrieb:
> Vielen Dank für den Hinweis, das Return als Abbruchbedingung habe ich
> wohl übersehen.
>
> Ist dieser Ansatz für ein Menü welches auf einem Display angezeigt
> werden soll empfehlenswert?


Kommt drauf an.
In den meisten Fällen ist dieser Ansatz nicht so toll.
Warum?

Weil es sich dabei dem Prinzip nach um eine Warteschleife handelt 
("warte solange, bis der Benutzer eine Eingabe gemacht hat"), und wir 
alle wissen, dass so etwas der Tod für ein Programm ist, welches mehrere 
Dinge gleichzeitig machen soll. Die Temperaturregelung eines Terrariums 
muss weiter laufen! Und zwar selbst dann, wenn der Benutzer noch 
überlegt, ob er per Menü die LCD-Hintergrundbeleichtung nun heller oder 
doch dunkler stellen will und zwischendurch noch aufs Klo muss.

Aber: in diesem Artikel geht es primär um Funktionszeiger und wie man 
mit ihnen arbeitet. Die Kombination aus Funktionszeiger und Text ist 
auch noch ok, aber die eigentliche Menüfunktion wird man ein wenig 
anders machen. Eben so, dass sie erstens 2-geteilt ist (Anzeige und 
Auswertung) und zweitens so, dass das 'Menü' nicht aktiv auf den 
Benutzer wartet, sondern mal kurz nachsieht ob es eine 
Benutzerbetätigung gegeben hat und wenn ja, diese dann auswertet (zb 
Cursor verschieben, Menü bei Bedarf scrollen, Funktion bei Bedarf 
aufrufen, etc.). Da dieses aber hochgradig von der tatsächlich 
vorhandenen Hardware abhängt (gibt es ein LCD? Wird die 
Benutzerinteraktion über UART und Terminal abgewickelt), kann man da 
keine allgemein verwendbare Standardfunktionen angeben. Das alles muss 
an die vorhandene Hardware angepasst werden (welche Tasten gibt es? Wo 
erfolgt die Ausgabe? Hat der Benutzer einen Cursor den er zur Markierung 
des Menüpunktes benutzt? Wie sieht der Cursor aus? etc. etc). Das alles 
kann man aber nicht voraussehen und in aller Allgemeinheit behandeln. 
Daher hab ich mich beim Schreiben des Artikels auf die einfachst 
mögliche Form der Benutzerinteraktion konzentriert, damit man die 
Benutzung des Funktionszeigers sieht. Denn genau darum geht es ja im 
Artikel: Funktionszeiger. Wer in seinem Sprachstudien bei 
Funktionszeiger angelangt ist, ist sowieso kein Anfänger mehr und hat 
seine ersten zehntausend Lines of Code schon programmiert. Der weiß 
auch, wie er dann seine Menüs aufbaut bzw. wie eine State-Machine 
funktioniert, mit der er dann das drumherum baut.

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