PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Sowas wie SPRUNGMARKEN in C



µcFlo
16.07.2012, 20:51
Hi,
ich habe ein Programm bei dem eine erfüllte Bedingung, den Ablauf des Programmes verändern soll.
Also sowas wie Goto.
Aber gibt es sowas in C und wenn wie geht es?


if(igendwas) {
//blabla
//Überspringe A und gehe zu B
}

//mach was (A)

//mach noch was (B)


Danke
Florian

-schumi-
16.07.2012, 21:11
Nimm nie-nie-nie-mals GOTO :!: Das nimmt man doch inzwischen nicht mal mehr bei Basic her...

Was du suchst ist:


if(irgendwas)
{
// mach was wenn "irgendwas" = wahr
}
else
{
// mach was wenn "irgendwas" = falsch [A]
}

// mach noch was, unabhänig von "if(bedingung)" [B]

MisterMou
16.07.2012, 21:12
http://lmgtfy.com/?q=goto+c
;)

Goto hat aber nichts mit sauberer Programmierung zu tun, es kann den Code unlesbar machen.

edit:
zu spät -.-

µcFlo
16.07.2012, 21:13
Danke -schumi-,
es müsste so funktionieren.

Danke
Florian

Klebwax
16.07.2012, 22:31
Nimm nie-nie-nie-mals GOTO :!:

Daraus folgt: nie-nie-nie-mals Assembler.


Goto hat aber nichts mit sauberer Programmierung zu tun, es kann den Code unlesbar machen.

Solche Veralgemeinerungen sind doch inzwischen überholt. Wie heißt es so schön: "Schlechte Entwickler schreiben in jeder Sprache unlesbaren Code".

Selbst in der neuesten C-Version ist goto enthalten und es gibt immer mal wieder Grund, es zu verwenden. Auch ein switch ist nichts anderes als ein berechnetes goto, der Doppelpunkt beim case sieht nicht durch Zufall wie ein Sprungziel aus.

Was aber sicher richtig ist, in C läßt sich das meiste lesbar ohne goto formulieren, obwohl in tief gestaffelten ifs und Schleifen ein "goto errorexit" zur Lesbarkeit beitragen kann. In Abwandlung des Zitats oben: Ein guter Entwickler darf auch goto verwenden.;)

MfG Klebwax

-schumi-
16.07.2012, 23:00
Daraus folgt: nie-nie-nie-mals Assembler.
Wenn du es schaffst, einen Prozessor zu entwickeln, der if/else/case/Unterprogramme usw. ohne Sprünge abhandeln kann, dann kannst du auch Assembler verwenden :)


Auch ein switch ist nichts anderes als ein berechnetes goto, der Doppelpunkt beim case sieht nicht durch Zufall wie ein Sprungziel aus.
Ein switch ist eine Vereinfachung einer Reihe IFs. Und die IF/ELSE sind bedingte Sprungmarken, was einfach daher rührt, dass die Prozessoren die wir haben ein Programm seriell abarbeiten und ein Sprung die einzige Möglichkeit einer Programmverzweigung ist. Sobald sich das geändert hat, wird auch das Goto verschwinden/ noch mehr in der Bedeutungslosigkeit als derzeit versinken, da bin ich mir sicher :)



Was aber sicher richtig ist, in C läßt sich das meiste lesbar ohne goto formulieren, obwohl in tief gestaffelten ifs und Schleifen ein "goto errorexit" zur Lesbarkeit beitragen kann.
Stimmt, da müsste noch am Break gefeilt werden..

Wenn sich das mit den GOTOs in Grenzen hält kann ich auch noch damit leben, aber vor allem als Anfänger sollte man die Finger davon lassen, und sich lieber mit Unterprogrammen usw. befassen... Aber bei Assembler lässt es sich halt derzeit kaum vermeiden...

Viele Grüße
-schumi-

(Ich mach jetzt erst mal nen "Goto Bed" xD)

oberallgeier
18.07.2012, 17:01
... sowas wie Goto. Aber gibt es sowas in C und wenn wie geht es? ...Hier lohnt sich wieder mal mein Kernighan/Ritchie. Da kommt das goto sogar im Sachverzeichnis vor.


...
3.8 goto und Marken
C verfügt auch über eine beliebig zu mißbrauchende goto-Anweisung und Marken ... Wir haben in diesem Buch goto nicht verwendet (Anmerkung von mir: *ggg*)...In einem großartigen Projekt (Transistortester) (http://www.mikrocontroller.net/articles/AVR-Transistortester) das ich nachgebaut und nach meinen Wünschen erweitert/geändert habe, werden mehrfach Sprungmarken verwendet - und das Ding läuft und läuft und läuft.

Ich meide Sprungmarken - fast immer. Aber nur, weil es so was Ähnliches ist wie rechts überholen - tut man nicht, nur manchmal dann doch.

radbruch
18.07.2012, 18:49
Alle Jahre wieder:

https://www.roboternetz.de/community/threads/33598-GOTO-s-sind-unschoen-oder-doch-nicht

Wirklich nett sind selbstmodifizierende Programme (http://www.google.de/search?q=selbstmodifizierende+Programme).

Schnell, kompakt und eine echte Herausforderung beim Debuggen :)

Janvi
27.07.2012, 19:44
Die Frage ist nicht ob goto oder nicht, sondern die Denkweise die bei einem Assemblerprogrammierer im Sinne von Nassi-Shneidermann nicht strukturiert ist.
Empfehlung: Formuliere dein Problem zunächst als NS-Diagramm (nicht Flußdiagramm) dann kannst du es anschliessend sowohl in ASM als auch in C codieren.
In ASM macht man das dann nicht immer so wie in C, weil man z. Bsp. irgendwo hinspringen kann wo es ein gemeinsames Ende gibt während man in C dieses
Ende als Funktion ausgegliedert mehrfach aufrufen müsste. Als ASM Programmierer leuchtet einem dieser scheinbar unnötige Aufwand nicht gerade ein, aber
wenn man genau guckt, optimiert ein guter C-Compiler das letztendlich auch wieder weg und macht bedingte Sprünge draus. Wenn der Optimierer was taugt,
so öhnlich (oder unübersichtlicher und schneller) wie man das selbst auch gemacht hätte. Manche Optimierer ersetzen sogar einen RETURN durch JUMP was
man als ASM Programmierer wegen der Übersichtlichkeit nicht unbedingt gemacht hätte.

Bei SPS Anweisungslisten (wurde früher bei Siemns S5 wie Assembler von diskrekt aufgebauten Prozessoren direkt ausgefürt) gibt es übrigens zahlreiche bedingt ausgeführte Befehle.
Im uC Assembler ist bedingte Ausführung meist nur für Sprünge bekannt, Siemens S5 machte das aber für Bitbefehle wie etwa Bit-setzen oder Bit-rücksetzen. Diese werden nur dann ausgeführt, wenn ein Flag
des Vorgängerbefehls dies erlaubt. Im uC Assmbler würde man da einen bedingten Sprung machen, der mit einer Sprungmarke hinter den Bitbefehl springt. Eben nur weil es keinen bedingt ausführbaren Bitbefehl gibt. Goto ist also keineswegs eine Frage des schlechten Stils sondern einfach nur der Denkweise. C-Neulinge können sich auch mal Anschauen, was der Compiler bei Break Anweisungen (=goto) macht. Das ist schließlich ein Befehl welcher sogar als "struktruiert" anerkannt ist.