Was ist der Sinn eines Flags?

Hallo ihr Lieben,

wir hatten vor ein paar Monaten in einer Übung die Frage:
Ihr Kollege zeigt Ihnen eines seiner Strukturdiagramme. Eine Funktion benötigt neben den normalen Parametern auch ein Status-Flag als Eingabeparameter. Welchen Rat können Sie dem Kollegen geben auch ohne die genaue Funktionsweise zu kennen?

Ich habe damals in Wikipedia einen guten Artikel gefunden und gab folgende Antwort:
Da die Status Flags den Ablauf steuern, kann der Benutzer nicht direkt entscheiden was getan werden soll. Daher ist es besser, keine weiteren Status-Flags einzubauen. Dadurch kann der Benutzer selbst entscheiden wie er vorgehen möchte.

Ich war mir bei meiner Antwort überhaupt nicht sicher, doch ich bekam trotzdem volle Punktzahl. Nun wollte ich mich mit dem Thema Flag etwas mehr beschäftigen und habe mir den Wikipedia Artikel nochmal durchgelesen und dort Stand auch, dass Flags Zugriffsrechte regeln können.

Mein Problem ist eigentlich, dass ich mir nicht vorstellen kann was ein Flag ist und was es bewirkt. Wenn ich das aus Wikipedia richtig verstanden habe gibt es mehrere Status Flags:
Carry-Flag
Zero-Flag
Sign-Flag
Overflow-Flag
Adjust-Flag
Parity-Flag
Interrupt-Enable-Flag
BCD-Flag

In Wikipedia ist auch ein C++ Beispiel zu einem Flag, wobei ich da auch nicht wirklich schlau daraus werde. Mich irritiert in der Frage vorallem der Satz „Eine Funktion benötigt neben den normalen Parametern auch ein Status-Flag als Eingabeparameter.“ Wie kann man einer Methode, z.B. in Java, einen Flag übergeben?

Hier noch die beiden Wikipedia Artikel die ich dazu gelesen habe:
http://de.wikipedia.org/wiki/Flag_%28Informatik%29
http://de.wikipedia.org/wiki/Statusregister

Liebe Grüße Matthias

Hallo Matthias,

Mein Problem ist eigentlich, dass ich mir nicht vorstellen
kann was ein Flag ist und was es bewirkt.

Ein Flag ist meistens einfach eine 1-Bit Variable.

Wenn ich das aus
Wikipedia richtig verstanden habe gibt es mehrere Status
Flags:
Carry-Flag
Zero-Flag
Sign-Flag
Overflow-Flag
Adjust-Flag
Parity-Flag
Interrupt-Enable-Flag
BCD-Flag

Dies sind alles Flags der ALU.
Als Programmierer sieht man diese nur, wenn man in Assembler Programiert.

Ein Flag benötigt man z.B. bei asynchronen Vorgängen.

Du hast ein extrne Steuerung, welche mit Motoren ein bestimmte Koordinate anfährt.
Du übergist dieser STeuerung eie Koordinate und sagts ihr, dass sie loslegen soll.
In deinem Programm setzt du ein Flag „SteuerungBusy“.
Wenn die Steuerung meldet, dass der Vorgang abgeschlossen ist, setzt du „SteuerungBusy“ wieder zurück.
Drch abfagen von „SteuerungBusy“ knnst du nun siherstellen, dass du nicht schon neue Befehle an die Seuerung sendest, bevor ein aktueller wirklich ausgeführt wurde.

Von mir gibt es z.B. ein Windows-Programm, welches ein Protokoll zu einer Maschine abwickelt, welches vom eigentlichen Bedienteil vewndet wird.

  1. Wenn es automatisch gestartet wird, ds macht das Bedienprogramm, läuft es unsichtbar im Hintergrund.
  2. Wird es manuell gestartet, wird beim Start ein Flag gesetzt und das Programm hat ein Fenster welches aktuelle Vorgänge anzeigt.
  3. Wird es manuell gestartet und anschöiessend das richtig Passwort in einem Menüpunkt eingegeben, wird ein weiteres Fläg gesetzt und das Fenster hat zusätzliche Menüs mit denen man direkt einzelne Befehle an die Maschine senden kann (Ist sehr hilfreich bei der Inbetriebnahme und der Fehlersuche, aber nix für die Kunden!).
    Die Flags werden dabei fleissig beim Programmablauf abgefragt.

MfG Peter(TOO)

Hallo Peter(TOO), :smile:

danke für deine schnelle Antwort. Jetzt kenne außer den Nachteilen auch mal einen Vorteil von Flags.

Außerdem macht das (Nachteil) Beispiel aus der Vorlesung jetzt auch Sinn. Dort hieß es ungefähr so. „Ein Programm verwaltet Druckaufträge und diese Programm hat einen Flag der die Aufträge verwaltet“. Wenn ich dich also richtig verstanden habe, müsste der Benutzer, durch diesen Flag, immer warten bis der Drucker fertig ist mit drucken, bevor er einen neuen Auftrag starten kann. Ist dass richtig? In der Situation ist ein Flag, wenn ich das richtig verstanden habe, natürlich unsinnig, da der Benutzer natürlich schnellst möglich alle Aufträge an den Drucker senden möchte.

Und was ist nun ein Status-Flag? :smile:

Liebe Grüße Matthias

Hi,

Du musst zwischen dem Drucker selber und der Druckerwarteschlange unterscheiden.

Der Drucker selber kann natürlich nur einen Auftrag gleichzeitig bearbeiten. Wenn er gerade einen bearbeitet ist er „busy“ und setzt das „busy-flag“. Solange dies der Fall ist kann die Warteschlange keinen Auftrag zum Drucker schicken.

Nun die Druckerwarteschlange. Die Druckerwarteschlange hat eine gewisse Größe die meist durch den Arbeitsspeicher begrenzt ist. Die Warteschlange hat ein „flag“ mit dem Namen „isFull-flag“. die Warteschlange kann so viele Aufträge annehmen bis sie irgendwann voll ist, danach setzt sie eben das flag. Wenn der Drucker mit einem Auftrag fertig ist, sendet die Warteschlange den nächsten Auftrag zum Drucker und ist dann eben nicht mehr voll weswegen das flag zurück genommen wird.

Die Warteschlange ist meist so groß, das dies nicht bemerkt wird.

MFG

1 Like

Hallo,
Flag = Flagge = Signal

ein Flag, wie immer es gestaltet ist - macht im Softwarebereich nichts anderes als im wirklichen Leben. Es signalisiert einen Zustand an Außenstehende.

Im wirklichen Leben signalisiert eine rote Fahne von einem Bauarbeiter den nahenden Auto: Halt! Strasse gesperrt. Dies wird dem Autofahrer erst bewusst wenn er die Fahne sieht. Der Baggerfahrer braucht diese Fahne nicht, da er den Zustand herbeigeführt hat.

Im Softwarebereich kann ein Bit, eine Zahl, ein String - schlicht alles was sich interpretieren lässt zu einem Signal werden. Wichtig ist auch hier. Dieses Signal wird für Programmteile oder Programmfunktionen gesetzt die nicht wissen können in welchem Zustand sich eine bestimmtes Objekt befindet.

Wenn eine Flagge oder ein Signal verschiedene Farben haben kann, dann hast du so etwas wie ein Status-Flag.

In o.g. Beispiel würde der Bauarbeiter die Flagge auf Grün drehen und der Autofahrer interpretiert das als weiterfahren.

Im Gegensatz zu einer physischen Sperre sind Signale aber Dinge die in der Regel auf gegenseitiger Beachtung beruhen, sofern nicht Maßnahmen ergriffen werden wenn das Signal missachtet wird.

Gruss
Joey

1 Like

Hallo ihr drei :smile:

danke für eure tollen Erklärungen, ihr habt mir sehr geholfen.

Liebe Grüße Matthias

Hallo Matthias,

Das wohl bekannteste Flag, welches sogar jeder Grundschüler kennt, ist „behalte Eins“ bei der Addition von zwei Ziffern.

Bei einer CPU nennt man diese Flag „Carry“, welches du anfangs mal aufgelistet hast.

MfG Peter(TOO)

1 Like