mikrocontroller.net

Forum: PC-Programmierung goto, wird immer Ausgeführt


Autor: Alibaba (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich programmiere c unter Linux.

in meinem Code habe ich eine File-Abrage mit einem Goto: verbunden:
das problem ist, das ausirgend einem Grund, immer am ende der Schleife 
in die PrError-Schleife ausgeführt wird als ob kein goto exestiert.

hat einer eine Idee woran es liegen könnte?? Danke

void main(){
.
.
.

  for (j=0; j<2; j++) 
  {

    fname[4] = '0' + j;

    if((fd[j]=fopen(fname,"w"))==NULL) 
    {
      printf("\nCannot open file %s.\n", fname); 
      goto PrError;                //<---------------------------------goto
    }
     else{printf("\nFile %s opened O.K.\n", fname);
   }
  }
.
.
.
.


PrError:
  for (j=0; j<2; j++) 
  {putchar('a');
    if(NULL != fd[j]) 
    {
      fclose (fd[j]);
      fd[j] = NULL;
    }
  }
}

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
warum denn auch nicht PrError: ist nur eine Sprungmarke. Es ist doch 
normal das er am ende diesen Code ausführt.

goto hat zwar seine berechtigung aber hier geht es bestimmt besser ohne.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du meinst also, daß eine Ok-Meldung ausgegeben, aber trotzdem gleich 
nach dem ersten Durchlauf aus der Schleife gesprungen wird?
Da sehe ich so erstmal keinen Grund dafür. Kannst du mal ein 
vollständiges Programm posten, das den Fehler zeigt?

Übrigens: main() muß int zurückgeben.

Autor: Alibaba (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mir geht es nur darum zu verstehen warum. Der abschnitt mit dem goto 
immer ausgeführt wird? Ich habe nur an der besagten stelle ein goto. Hab 
bis jetzt gedacht das dieser Abschnitt nur dann in kraft tritt wenn mit 
goto dadrauf gesprungen wird. Ich weiss man das, dass goto nicht gerne 
verwendet wird. aber ich wollte einen sprung haben aus vielen 
abschnitten des codes haben und das war für mich die einfacherere 
Lösung.

hab jetzt mal vor dem "PrError" ein zeichen ausgegeben, das goto 
komplett auskomentiert und jetzt bin ich komplett verwirrt.
.
//goto PrError;

.

putchar('b');

PrError:
  for (j=0; j<2; j++)
  {
    putchar('a');
    if(NULL != fd[j])
    {
      fclose (fd[j]);
      fd[j] = NULL;
    }
  }
.

Die Ausgabe lautet baabaa. Meiner Meinung nach sollte entweder nur 
einmal b oder nur baa ausgegeben werden.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Poste vollständigen anständig formatierten Quelltext und verwende die 
unter Formatierung oberhalb des Texteingabefeldes aufgeführten Codes, um 
"C-Code" mit Syntaxhighlighting anzeigen zu lassen.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alibaba schrieb:
> Die Ausgabe lautet baabaa. Meiner Meinung nach sollte entweder nur
> einmal b oder nur baa ausgegeben werden.

doch das ist normal. Das ist wie beim Monopoli, es gibt  "Gehe zu Start" 
und es gibt den normale ablauf, dabei kommt man auch zum Start. Das eine 
ist nur eine akürzung.

Autor: Alibaba (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kommando zurück. Mir ist aufgefallen, dass ich die funktion über die wir 
sprechen zweimal ausgeführt wird, desshalb auch die doppelte ausführung 
Sorry. ausgegeben wird nur baa.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also nur ein Schaf.

Autor: Web-Applikator (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ersetze
"PrError:"
durch
return;
PrError:"

Sprunglabels werden einfach ignoriert, wenn sie im normalen Ablauf 
vorkommen. Wenn das nicht gewünscht ist, musst du den normalen 
Programmablauf um den "PrError"-Teil herumleiten.

Autor: Alibaba (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter schrieb:
> doch das ist normal. Das ist wie beim Monopoli, es gibt  "Gehe zu Start"
> und es gibt den normale ablauf, dabei kommt man auch zum Start. Das eine
> ist nur eine akürzung.
>
>
eine super Erklärung extra für leute wie mich ;-)

Autor: Alibaba (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rufus t. Firefly schrieb:
> Also nur ein Schaf.

Ja genau keine Herde :-))

Autor: XXX (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo ist jetzt das Problem? Das Programm macht das, was du vorgibst.

Du gibst als erstes 'b' aus, dann in der Schleife exakt zweimal
'a', so wie es der Schhleifenrumpf vorgibt!

Gruß
Joachim

Autor: Alibaba (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
XXX schrieb:
> Wo ist jetzt das Problem? Das Programm macht das, was du vorgibst.

Ja das merke ich auch grade. Ich habe vor 5min. nur gedacht das ein 
goto-Abschnitt dann ausgeführt wird, wenn durch ein goto zum abschnitt 
gesprungen wird.

Web-Applikator schrieb:
> return;
> PrError:"

Die kombination mit einem return ist glaube ich in meinem Fall die beste 
lösung. Hätte einwenig mehr googeln sollen.

Trotzdem danke.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.