Hallo
Kann man in C nicht eine Sprungmarke setzten und dorthin springen?
Mein Problem ist folgendes. Ich lese über UART Werte ein. Jetzt möchte
ich bis auf eine bestimmte Zeichenkette alle Werte verwerfen.
Ich brauche also folgende Abfrage:
Ist Zeichen 0x02? Wenn ja, ist nächstes Zeichen 0x69? Wenn nein, ist es
0x02? Wenn ja, springe zur Abfrage ob zweites Zeichen 0x69 ist... usw..
Wie macht man sowas?
Eine if Abfrage reicht hier nicht, denn:
Wenn das erste Zeichen 02 ist, das zweite Zeichen eine 69, dann aber
fälschlicherweise eine 02 kommt, könnte diese ja das erste erwartete
Zeichen sein. Ich müsste dann also an die Stelle springen an der das
zweite Zeichen abgefgar wird...
@ Marco (Gast)
>Kann man in C nicht eine Sprungmarke setzten und dorthin springen?
Ja, mit goto. Aber HALT! Das ist der falsche Weg! GOTO verwendet man
nicht.
MfG
Falk
Zwar gibt es ein goto, aber das sollte man sich für absolute
Ausnahmefälle aufheben (*), ansonsten entsteht ganz schnell der
berüchtigte sogenannte Spaghetti-Code: er ist wie ein Teller
Spaghetti, ziehst du an einem Ende dran, kommt nach und nach
alles hinterher...
Das, was du willst, macht man normalerweise mit einer
Kombination aus Schleife (for oder while) und case-Anweisung.
(*) Für eine Fehlerbehandlung beispielsweise, damit lassen sich
u. U. tief verschachtelte (und damit auch nicht mehr übersichtliche)
if-else-Strukturen vermeiden.
Ich weiß ja nicht ob ich gestern einfach zu wenig geschlafen habe oder
woher das Brett vorm Kopf kommt...
Aber mit if, while und case schaffe ich es einfach das zu realisieren
was ich vorhabe.
Marco wrote:
> So, jetzt hab ichs mit einem wilden Konstukt doch noch hinbekommen....
Zeig mal das wilde Konstrukt.
Vielleicht kann man es noch etwas zähmen.
Mir ist nämlich aus deiner Beschreibung noch nicht wirklich
klar, was du eigentlich willst, bzw. wo das Problem dabei liegt.
Aber ich wage mal eine Interpretation und biete folgende Lösung
dafür an:
1
// Das ist die Sequenz an Bytes die so, in dieser Reihenfolge
2
// empfangen werden muss, damit eine Aktion ausgelöst werden
3
// kann
4
unsignedcharSequence[]={0x02,0x69};
5
unsignedcharSequenceNr=0;
6
7
voidCheckSequence(unsignedcharReceivedByte)
8
{
9
// Stimmt dieses Byte mit dem nächsten zu erkennenden Byte
10
// überein?
11
if(ReceivedByte==Sequence[SequenceNr])
12
13
// Wenn ja: registrieren, dass wieder ein Byte der Seuquenz
14
// gepasst hat
15
16
SequenceNr++;
17
18
// War das das letzte zu erkennende Byte der
19
// vorgegebenen Sequenz? Wenn ja: Hurra: Aktion auslösen
20
// und wieder in den Grundzustand gehen
21
if(SequenceNr==sizeof(Sequence){
22
Aktion();
23
SequenceNr=0;
24
}
25
}
26
27
else{
28
// Das empfangene Byte hat nicht gepasst. Daher zurück
29
// an den Start und erneut auf den Beginn der Sequenz
30
// warten
31
SequenceNr=0;
32
}
33
}
Du stopfst Byte für Byte, so wie du sie vom UART empfängst, in diese
Funktion hinein. Wenn die empfangene Bytesequenz der Vorgabe im
Array entspricht, wird die Funktion Aktion() aufgerufen.
Sobald in der Übertragungssequenz irgendwo ein Fehler auftaucht,
muss die komplette Sequenz, von vorne beginnend, erneut auftauchen
Hier mal mein Konstrukt.
Das Problem ist, das das erste Zeichen, also die 0x02 nicht verloren
gehen darf wenn Sie mittendrin auftaucht. Denn das könnte ja der Anfang
der erwarteten Bytefolge sein...
Ich verwende, wenn es den Code einfacher macht "goto" und "label:"
for (...)
{
while(...)
{
if ( alles falch ) goto Fehlerfall ;
...
}
}
....
Fehlerfall:
...
Hans-jürgen Herbert wrote:
> Ich verwende, wenn es den Code einfacher macht "goto" und "label:">> for (...)> {> while(...)> {> if ( alles falch ) goto Fehlerfall ;> ...> }> }> ....>>> Fehlerfall:> ...
Eine Frage: wird denn bei solch einem Konstrukt der Stack aufgeräumt?
D.h. wird das Programm im Falle "alles Falsch" exakt so weiterlaufen wie
wenn die for-Schleife "normal" beendet wird ???
Gruß
Andreas
Der Stackframe existiert nur auf Funktionsebene. Und Labels kann man
eben auch nur innerhalb einer Funktion anspringen.
Es ist also nicht möglich ein Label in einer anderen Funktion
anzuspringen.