Forum: Mikrocontroller und Digitale Elektronik Mal wieder ein C-Problem


von Duu (Gast)


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?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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?

von Duu (Gast)


Lesenswert?

Ich möchte aus der Funktion Schalter dann zu dem marker1 springen, wenn 
der Schalter auf 1 ist

von Rufus Τ. F. (rufus) Benutzerseite


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)

von Alex W. (Firma: FH) (olek)


Lesenswert?

du meinst eine interruptroutine aufrufen?

von ?-?-? (Gast)


Lesenswert?

Duu schrieb:
> volatile marker1;

Geht es ohne dem?

von Duu (Gast)


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

von Duu (Gast)


Lesenswert?

@?-?-? nein, da kommt der gleiche Fehler

von Rene H. (Gast)


Lesenswert?


von Jürgen S. (jurs)


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.

von Joerg P. (pleumann)


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

von Walleby (Gast)


Lesenswert?

hehe schöne Mischung aus BASIC und C :)
Die Funktion (Schalter); klappt so auch nicht --> Schalter();

von Oliver S. (oliverso)


Lesenswert?

Wobei
>Mal wieder ein C-Problem

ja wohl geprahlt ist.

Oliver

von Vlad T. (vlad_tepesch)


Lesenswert?

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
}

von (prx) A. K. (prx)


Lesenswert?

Walleby schrieb:
> hehe schöne Mischung aus BASIC und C :)

Ja, da grinst einem das antike ON ERROR GOTO entgegen. ;-)

von Walleby (Gast)


Lesenswert?

immer diese Errors... Wenigstens weiß man bei den BASIC-Errors wo man 
nachschaun muss:)

von Bronco (Gast)


Lesenswert?

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

von Hans (Gast)


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.

von Karl H. (kbuchegg)


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

von DirkB (Gast)


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.

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

DirkB schrieb:
> Abgekürzt heißt das dann VC20.

und C64 kommt dann 2064 ? ;)

von katastrophenheinz (Gast)


Lesenswert?

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!

von DirkB (Gast)


Lesenswert?

Nein, denn ich like Facebook nicht.

von Icch (Gast)


Lesenswert?

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

von Vlad T. (vlad_tepesch)


Lesenswert?

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
Noch kein Account? Hier anmelden.