Mal wieder ein C-Problem

Gast #2888810
Lesenswert?

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?
Persönliche Seite #2888821
Lesenswert?

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)
Gast #2888830
Lesenswert?

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
#2888846
Lesenswert?

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.
#2888850
Lesenswert?

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
Gast #2889436
Lesenswert?

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.
#2889917
Lesenswert?

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.)
Gast #2889939
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren