goto, wird immer Ausgeführt

Gast #1941508
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
}
Gast #1941521
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.
Gast #1941556
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.
Gast #1941563
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.
Gast #1941568
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.
Gast #1941594
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

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