Hallo, ich bin mal wieder in Schwierigkeiten. Folgendes Problem #include <avr/io.h> #include <setjmp.h> volatile marker1; void Schalter (void) // Abfrage Schalter { if (PINE & (1<<PINE7) ) { goto marker1; } } int main (); while (1); { // Supergeiles Programm // . // . // . (Schalter); } marker1: // weiteres Programm Das Probelm ist jetzt, das mir das AVR Studio sagt, das marker1 benutzt wird aber nicht definert ist. Wie bekomme ich diesen Sprung hin?
Duu schrieb: > Wie bekomme ich diesen Sprung hin? Indem du eine Funktion aufrufst... Man verwendent in C kein GOTO! > Wie bekomme ich diesen Sprung hin? Was willst du denn überhaupt machen?
Ich möchte aus der Funktion Schalter dann zu dem marker1 springen, wenn der Schalter auf 1 ist
ceterum censeo: Kauf Dir ein C-Buch. Das klingt vielleicht auf den ersten Blick wenig hilfreich, aber bei so fundamentalen Verständnisproblemen ist das die einzige sinnvolle Lösung. Empfehlenswert: Brian Kernighan & Dennis Ritche, "Programmieren in C", 2. Ausgabe, Hanser-Verlag. (Das behandelt zwar nur C89, aber die Grundkonzepte haben sich seitdem auch nicht geändert)
ich weiß nicht, ob man sowas eine Interruptroutine nennt. Ich möchte einfach nur von einer Funktion zu einen Marker springen. Mit asm volatile (jmp "marker1" hab ich es auch schon versucht, aber ohne erfolg
Duu schrieb: > goto marker1; In C kannst Du mit goto NICHT innerhalb des gesamten Programms springen, sondern nur innerhalb derselben Funktion. Nützlich ist das unter C eigentlich nur, um aus tief geschachtelten Schleifen heraus problemlos zum Ende der Funktion springen zu können. Was anderes kann C-goto nicht, insbesondere also nicht aus der Funktion herausspringen.
Hallo Duu, Duu schrieb: > Ich möchte aus der Funktion Schalter dann zu dem marker1 springen, wenn > der Schalter auf 1 ist Das würdest Du vielleicht in Assembler tun, nicht aber in einer strukturierten Programmiersprache wie C. Vorschlag (nur getippt, nicht auf syntaktische Korrektheit geprüft):
1 | boolean Schalter() // Abfrage Schalter |
2 | {
|
3 | if (PINE & (1<<PINE7) ) |
4 | {
|
5 | return true; |
6 | }
|
7 | else
|
8 | {
|
9 | return false; |
10 | }
|
11 | }
|
12 | |
13 | int main (); |
14 | do { |
15 | {
|
16 | // Supergeiles Programm
|
17 | // .
|
18 | // .
|
19 | // .
|
20 | }
|
21 | while (!Schalter()); |
22 | |
23 | // Weiteres Programm
|
Der Vorschlag mit dem C-Buch scheint mir angesichts der Frage angebracht. Kernighan/Ritchie ist sehr kompakt und sehr lesbar, also empfehlenswert. Grüße Jörg
hehe schöne Mischung aus BASIC und C :) Die Funktion (Schalter); klappt so auch nicht --> Schalter();
Joerg Pleumann schrieb: > int main (); > do { > { da stimmt ja gar nix
1 | #include <stdbool.h> |
2 | |
3 | static inline bool Schalter() // Abfrage Schalter |
4 | {
|
5 | return (PINE & (1<<PINE7); |
6 | }
|
7 | |
8 | int main () |
9 | {
|
10 | do
|
11 | {
|
12 | // Supergeiles Programm
|
13 | // .
|
14 | // .
|
15 | // .
|
16 | }
|
17 | while (!Schalter()); |
18 | // Weiteres Programm
|
19 | |
20 | }
|
Walleby schrieb: > hehe schöne Mischung aus BASIC und C :) Ja, da grinst einem das antike ON ERROR GOTO entgegen. ;-)
immer diese Errors... Wenigstens weiß man bei den BASIC-Errors wo man nachschaun muss:)
A. K. schrieb: >> hehe schöne Mischung aus BASIC und C :) > > Ja, da grinst einem das antike ON ERROR GOTO entgegen. ;-) Der Fehler des OT ist, daß er die Zeilennummern vergessen hat...
Du musst in der Zeile in der dein Marker steht, eine Codezeile haben. Ich finde goto nicht so schlecht. Die oft kritisierete Unübersichtlichkeit hält sich bei sparsamer Verwendung in Grenzen. Besser als komplizierteste Verschachtelungen um sich eben das goto zu sparen.
Hans schrieb: > Du musst in der Zeile in der dein Marker steht, eine Codezeile haben. > Ich finde goto nicht so schlecht. Die oft kritisierete > Unübersichtlichkeit hält sich bei sparsamer Verwendung in Grenzen. > Besser als komplizierteste Verschachtelungen um sich eben das goto zu > sparen. ... ein Fall der hier aber ziemlich sicher NICHT vorliegt. (Ich hab nichts gegen goto. In den 25 Jahren hat es tatsächlich 3 oder 4 mal einen Fall gegeben, in dem der goto die einfachste Lösung war. Aber bitte hör auf einem Anfänger einzureden, dass goto seine Lösung ist. Denn die ist es nicht. Es gibt in seinem Stadium immer bessere Lösungen. Und die fangen damit an, dass er seine Gedanken ordnet und anfängt strukturiert zu arbeiten.)
Duu schrieb: > #include <avr/io.h> > #include <setjmp.h> > volatile marker1; > > void Schalter (void) // Abfrage Schalter > { Das ist das Void-C. Da gibt es nur globale Variablen und keine Funktionsparameter. Der Standard wird 2020 veraschiedet. Abgekürzt heißt das dann VC20.
DirkB schrieb: > Das ist das Void-C. > > Da gibt es nur globale Variablen und keine Funktionsparameter. > > Der Standard wird 2020 veraschiedet. > > Abgekürzt heißt das dann VC20. :-) Gibt's da schon ne Facebook-Seite? Ich möchte die liken!
Duu schrieb: > Wie bekomme ich diesen Sprung hin? Indem du ihn weg läßt. Formulier dein Problem in einem Nassi-Shneiderman-Diagramm. Dann kannst du es direkt in blockorientierte Programmierung in C umsetzen. http://de.wikipedia.org/wiki/Nassi-Shneiderman-Diagramm
Icch schrieb: > Indem du ihn weg läßt. > Formulier dein Problem in einem Nassi-Shneiderman-Diagramm. O goto gott! gibt es wirklich leute, die noch damit arbeiten?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.