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


von Alibaba (Gast)


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

1
void main(){
2
.
3
.
4
.
5
6
  for (j=0; j<2; j++) 
7
  {
8
9
    fname[4] = '0' + j;
10
11
    if((fd[j]=fopen(fname,"w"))==NULL) 
12
    {
13
      printf("\nCannot open file %s.\n", fname); 
14
      goto PrError;                //<---------------------------------goto
15
    }
16
     else{printf("\nFile %s opened O.K.\n", fname);
17
   }
18
  }
19
.
20
.
21
.
22
.
23
24
25
PrError:
26
  for (j=0; j<2; j++) 
27
  {putchar('a');
28
    if(NULL != fd[j]) 
29
    {
30
      fclose (fd[j]);
31
      fd[j] = NULL;
32
    }
33
  }
34
}

von Peter (Gast)


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.

von Rolf Magnus (Gast)


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.

von Alibaba (Gast)


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.

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Peter (Gast)


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.

von Alibaba (Gast)


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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Also nur ein Schaf.

von Web-Applikator (Gast)


Lesenswert?

ersetze
"PrError:"
durch
1
return;
2
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.

von Alibaba (Gast)


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

von Alibaba (Gast)


Lesenswert?

Rufus t. Firefly schrieb:
> Also nur ein Schaf.

Ja genau keine Herde :-))

von XXX (Gast)


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

von Alibaba (Gast)


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.

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.