![]() |
Goto
hey ich bins ma wida
also ich möchte gern ma wissen wie die goto funktion funzt?
Delphi-Quellcode:
so würd ich es denken//bsp// if bla bla =1 then goto 3 else 4; 3 close; 4 label1.caption:=2; aber irgendwie geht das net! kann mir einer helfen? mfg Tobi |
Re: Goto
Vergiss goto!!!
Delphi-Quellcode:
if bla bla =1 then
begin ... end else begin close; end; |
Re: Goto
ja so mach ich es ja grad zurzeit
aber ich will halt net immer wida alles nochma schreiben bzw kopieren er soll z.b halt bla bla öffters kontrollieren deswegen will ich goto mfg tobi |
Re: Goto
Dann lagere den Code in eine Prozedur/Funktion aus. Ein Grund warum Herr Wirth Pascal erfunden hat, war das problematische goto.
Delphi-Quellcode:
procedure DerCode;
begin ... end;
Delphi-Quellcode:
if bla bla =1 then DerCode else close;
|
Re: Goto
Hi,
Labels und GoTo gelten als veraltet und sollten nicht mehr verwendet werden. Für Schleifen gibt es break (zum vorzeitigen Abbbruch) und Continue (vorzeitige Fortsetzung), wofür früher goto verwendet wurde. Für deinen Fall - der kurze Text im Beispiel kann ruhig öfter geschrieben werden. Falls du längere Abschnitte hast, solltest du sie in eine eigene procedure auslagern. Mfg FAlter Oh, da war wohl jemand schneller :stupid: |
Re: Goto
Wie schon mkinzler angedeutet hat, gehört die Goto-Anweisung (zumindest IMHO) eher zum schlechteren Programmierstil. Es gibt wesentlich kompaktere und v.a. übersichtliche Lösungen (Stichwort Switch, Case, etc.). Eventuell zeigst Du uns mal etwas mehr von Deinem Code und was genau Du lösen möchtest. Ich bin mir ganz sicher, daß wir eine passende(re) Lösung für Dich finden! Ich habe bisher auch in meinen größten Projekten (für MICH zumindest sind sie groß) noch niemals eine Goto-Anweisung benötigt und dennoch (kaum) redundanten Code benutzen müssen.
SCRaT |
Re: Goto
ja ich weiß ja was ihr meint
so mach ich es ja grad. aber ich brauche unbedingt goto, ich kann bloß nicht erklären warum :D mfg tobi |
Re: Goto
[Ironie]Es ist schlecht mit dem kopf gegen eine Wand zu rennen. Ich muß es aber, kann euch aber nicht erklären warum[/Ironie]
|
Re: Goto
Was willst du denn machen?
|
Re: Goto
Zitat:
Delphi-Quellcode:
Viel Glück damit und hoffentlich weißt Du in 1 Jahr auch noch, wo in Deinem Programm hin- und hergesprungen wird. Ich verwette eine Kiste kaltes Bier, daß wir Dir eine vernünftigere Lösung präsentieren hätten können :thumb:
program labeltest;
uses crt; label 1,2; begin writeln('Was kommt jetzt?'); goto 2; 1:writeln('Label1 wird nicht aufgerufen!'); 2:writeln('Label2 ist sofort dran!'); readkey end. Liebe Grüße, SCRaT |
Re: Goto
danke scrat
thx @ all ja ich weiß es geht einfacher :-D aber naja @ scrat ich schreib mir immer hinter allem was ich mach eine info was passiert^^ MFG MasterTobi |
Re: Goto
Gib uns doch wenigstens die Chance dir zu Zeigen, wie man es besser machen würde. Das schadet dir nicht und macht dich Klüger und wenn es dir nicht gefällt kannst du ja bei deiner Goto-Lösung bleiben.
|
Re: Goto
|
Re: Goto
Hi,
Wenn, dann gib den Labels wenigstens Namen und nicht Nummern :(
Delphi-Quellcode:
Die sagen schonmal mehr aus als eine Zahl.
procedure TForm1.Button1Click(Sender: TObject);
label Blubb; begin goto Blubb; ShowMessage('Wird übersprungen.'); Blubb: ShowMessage('Blubb'); end; Ansonsten versuche nochmal, ohne Labels klarzukommen. Hört sich irgendwie nach Schule an - ich schaffe es zumindest meistens, Ausnahmeregelungen zu bekommen, z. B. Listen statt mit record und Zeiger gleich als Klassen zu implementieren, desgl. Bäume. Allerdings hatten wir NIE GoTo in der Schule und selbst unsere Lehrer wissen, dass man GoTos nicht verwenden sollte (als eine Schülerin es mal tat, haben sie ihr das gesagt), auch, wenn sie nicht mal Result verwenden und Arrays als Feld bezeichnen, obwohl Anordnung, Aufstellung, oder - im Sinne der Informatik - Datenreihe viel besser passen würden. [ot] Meiner Definition nach ist sowas ein Feld:
Delphi-Quellcode:
[/ot]
type
TBlaBlubb = class private Feld: Typ; // <-- das da (privates Feld) public Flur: Typ; // <-- das da (öffentliches Feld) end; Mfg FAlter |
Re: Goto
@Tobi: Du darfst uns gern glauben, wir sind allein um deine Gesundheit besorgt.
![]() |
Re: Goto
Delphi hat genügend "smart jumps", also exakte und genau definierte Sprungmöglichkeiten, dass GoTo nicht mehr notwendig sein sollte.
Es fehlen noch Dinge wie Iteratoren und ein paar andere Möglichkeiten, die selbst die letzten (sinnvollen) Anwendungen von GoTo komplett unnötig machen. Manche moderne Sprachen haben gar kein GoTo mehr, sogar Pascal-Derivate (zum Beispiel Chrome). In 99.999% aller Fälle sind if,while, for, repeat, procedure/function, break, continue, exit, raise unendlich sinnvoller als GoTo. Denn obengenannte keywords sind Teil von Sprachkonstrukten, die so gestaltet wurden, dass man aucrealativ einfach h lesen und nachvollziehen kann was source code macht. Ganz zu schweigen, dass du damit dem Compiler Information darüber lieferst was du da machen willst und er somit den Quelltext optimierter in Machinensprache übersetzen kann, |
Re: Goto
Pascal hatte ursprünglich auch kein goto
|
Re: Goto
Zitat:
Wie um himmels willen findet man auf die schnelle solche Cartoons zu einem x-beliebigen Thema?!? Irgendwie werde ich aber das Gefühl nicht los, daß wir Tobi nicht umstimmen können :wall: Naja, warten wir auf seinen Thread "Wo springt man Programmcode denn hin - und warum?!?" :oops: SCRaT //EDIT: @elvis - Was sind denn Iteratoren? Evtl. kenne ich nur den Begriff nicht, jetzt bin ich aber neugierig geworden und Google liefert mir nichts... |
Re: Goto
Hallo Markus,
Zitat:
Gruß Hawkeye |
Re: Goto
Wirths Pascal hatte kein goto. Wurde später aus einem mir unerklärlichen Grund wieder eingeführt.
|
Re: Goto
Zitat:
Sinnbefreites Beispiel für die nichtssagende Erklärung :freak: :
Delphi-Quellcode:
Könnte man so benutzen:
type
Sample = class public class method Test(startValue, endValue : Integer) : sequence of Integer; iterator; end; implementation class method Sample.Test(startValue, endValue : Integer) : sequence of Integer; begin for i : Integer := startValue to endValue do yield i; end;
Delphi-Quellcode:
Der wirklich Iterator (oder Enumerator in MS-speak) wird vom Compiler als eine state machine umgesetzt, die bei jedem Aufruf auf MoveNext zum nächsten yield springt.
for i in Sample.Test(2, 10) do
Console.WriteLine(i); |
Re: Goto
Oje, muss gestehen, daß ich so etwas noch nie benutzt habe. Danke für den anschaulichen Code. Wenn ich mal Zeit habe, werde ich mir ihn mal genauer anschauen!! Thanx.
SCRaT |
Re: Goto
@Markus
Vom Meister selbst: ![]() Das Fehlen von GOTO in späteren Wirth-Sprachen zeigt ja sehr deutlich, daß er es selbst für überflüssig hielt. Aber ob das "Meister" Tobi überzeugt? @SCRaT Das geht (leider nicht ganz so schön wie in Chrome) auch in neueren Delphi-Versionen: ![]() Gruß Hawkeye |
Re: Goto
Zitat:
Hier noch die Delphi-Umsetzung von Elvis' Beispiel:
Delphi-Quellcode:
Die marginal vergrößerte Codelänge kann angesichts der Tatsache, dass dieser Iterator in beide Richtungen funktioniert, wohl vernachlässigt werden :zwinker: .
type
TForLoopEnumerator = class // *hust* Interfaces? *hust* fTo, fCurrent: Integer; public constructor Create(aFrom, aTo: Integer); function MoveNext: Boolean; property Current: Integer read fCurrent; end; TForLoop = class fFrom, fTo: Integer; public function GetEnumerator: TForLoopEnumerator; property From: Integer read fFrom write fFrom; property &To: Integer read fTo write fTo; end; { TForLoopEnumerator } constructor TForLoopEnumerator.Create(aFrom, aTo: Integer); begin fCurrent := aFrom - Sign(aTo - aFrom); // MoveNext wird bereits vor dem ersten // Schleifendurchgang aufgerufen, also musse fCurrent künstlich einen Schritt // zurückgesetzt werden fTo := aTo; end; function TForLoopEnumerator.MoveNext: Boolean; begin Result := fCurrent <> fTo; Inc(fCurrent, Sign(fTo - fCurrent)); end; { TForLoop } function TForLoop.GetEnumerator: TForLoopEnumerator; begin Result := TForLoopEnumerator.Create(From, &To); end; var i: Integer; loop: TForLoop; begin loop := TForLoop.Create; loop.From := 10; loop.&To := -1; for i in loop do Writeln(i); Readln; end. Zitat:
![]() ![]() [edit]Einmal Editieren ist dem Cache wohl zu wenig :stupid: .[/edit] |
Re: Goto
sequences sind IEnumerable<T>, nur nicht so hässlich. Gab ja bereits "array of". :)
|
Re: Goto
Zitat:
![]() |
Re: Goto
Hi,
was hat das alles noch mit goto zu tun? :warn: Mfg FAlter |
Re: Goto
Zitat:
|
Re: Goto
Delphi-Quellcode:
???? :mrgreen: :mrgreen: :mrgreen:
goto Hell;
|
Re: Goto
Goto 3 ist doch schon viel besser. Die liegt hier vor mir auf dem Tisch. Wetten ? :mrgreen:
|
Re: Goto
Zitat:
|
Re: Goto
*auch OT-Senf dazu abgeben will*
![]() Gruß Calculon -- |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:08 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz