Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Goto (https://www.delphipraxis.net/98180-goto.html)

MasterTobi 22. Aug 2007 19:44


Goto
 
hey ich bins ma wida

also ich möchte gern ma wissen wie die goto funktion funzt?

Delphi-Quellcode:

//bsp//

if bla bla =1 then goto 3 else 4;


close;


label1.caption:=2;
so würd ich es denken
aber irgendwie geht das net!
kann mir einer helfen?

mfg
Tobi

mkinzler 22. Aug 2007 19:46

Re: Goto
 
Vergiss goto!!!

Delphi-Quellcode:
if bla bla =1 then
begin
    ...
end
else
begin
    close;
end;

MasterTobi 22. Aug 2007 19:50

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

mkinzler 22. Aug 2007 19:55

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;

FAlter 22. Aug 2007 19:57

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:

scrat1979 22. Aug 2007 19:57

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

MasterTobi 22. Aug 2007 20:03

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

mkinzler 22. Aug 2007 20:07

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]

inherited 22. Aug 2007 20:12

Re: Goto
 
Was willst du denn machen?

scrat1979 22. Aug 2007 20:12

Re: Goto
 
Zitat:

Zitat von MasterTobi
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

Okay, habe gerade mal meinen Freund Google bemüht. Auch wenn auf fast allen Seiten von der Verwendung abgeraten wird, möchte ich Dir aus paswiki.de das Beispiel nicht vorenthalten - Warum habe ich das Gefühl, daß Du Dir nicht weiterhelfen lassen möchtest?!? :cheers:

Delphi-Quellcode:
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.
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:

Liebe Grüße,

SCRaT

MasterTobi 22. Aug 2007 20:15

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

inherited 22. Aug 2007 20:17

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.

mkinzler 22. Aug 2007 20:23

Re: Goto
 
http://www.cs.utexas.edu/users/EWD/t...xx/EWD215.html

FAlter 22. Aug 2007 20:31

Re: Goto
 
Hi,

Wenn, dann gib den Labels wenigstens Namen und nicht Nummern :(

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
label
  Blubb;
begin
  goto Blubb;
    ShowMessage('Wird übersprungen.');
  Blubb: ShowMessage('Blubb');
end;
Die sagen schonmal mehr aus als eine Zahl.

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:
type
  TBlaBlubb = class
  private
    Feld: Typ; // <-- das da (privates Feld)
  public
    Flur: Typ; // <-- das da (öffentliches Feld)
  end;
[/ot]

Mfg
FAlter

Khabarakh 22. Aug 2007 20:40

Re: Goto
 
@Tobi: Du darfst uns gern glauben, wir sind allein um deine Gesundheit besorgt. Wirklich.

Elvis 22. Aug 2007 20:43

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,

mkinzler 22. Aug 2007 20:46

Re: Goto
 
Pascal hatte ursprünglich auch kein goto

scrat1979 22. Aug 2007 20:46

Re: Goto
 
Zitat:

Zitat von Khabarakh
@Tobi: Du darfst uns gern glauben, wir sind allein um deine Gesundheit besorgt. Wirklich.

Na Gott sei Dank ist ja im Zweifelsfalle ein Arzt mit im Thread *lach*

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...

Hawkeye219 22. Aug 2007 20:54

Re: Goto
 
Hallo Markus,

Zitat:

Zitat von mkinzler
Pascal hatte ursprünglich auch kein goto

PASCAL schon, erst mit Modula-2 wurde das GOTO abgeschafft. Trotz allem sollte man es natürlich auch in PASCAL nach Möglichkeit vermeiden.

Gruß Hawkeye

mkinzler 22. Aug 2007 20:56

Re: Goto
 
Wirths Pascal hatte kein goto. Wurde später aus einem mir unerklärlichen Grund wieder eingeführt.

Elvis 22. Aug 2007 21:16

Re: Goto
 
Zitat:

Zitat von scrat1979
//EDIT: @elvis - Was sind denn Iteratoren? Evtl. kenne ich nur den Begriff nicht, jetzt bin ich aber neugierig geworden und Google liefert mir nichts...

Damit kann man eine for-in Iteration sozusagen von innen aufbauen und man muss nur einzelne Werte rauswerfen, die dann ein Schleifendurchlauf im for-in werden.
Sinnbefreites Beispiel für die nichtssagende Erklärung :freak: :
Delphi-Quellcode:
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;
Könnte man so benutzen:
Delphi-Quellcode:
for i in Sample.Test(2, 10) do
  Console.WriteLine(i);
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.

scrat1979 22. Aug 2007 21:19

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

Hawkeye219 22. Aug 2007 21:27

Re: Goto
 
@Markus
Vom Meister selbst: Revised Report (1972)
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: klick

Gruß Hawkeye

Khabarakh 22. Aug 2007 22:06

Re: Goto
 
Zitat:

Zitat von scrat1979
Wie um himmels willen findet man auf die schnelle solche Cartoons zu einem x-beliebigen Thema?!?

Wer xkcd kennt, kennt für jedes Thema einen Comic. Sei es über Informatik, Mathematik oder Velociraptoren :D .

Hier noch die Delphi-Umsetzung von Elvis' Beispiel:
Delphi-Quellcode:
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.
Die marginal vergrößerte Codelänge kann angesichts der Tatsache, dass dieser Iterator in beide Richtungen funktioniert, wohl vernachlässigt werden :zwinker: .

Zitat:

Zitat von Pelvis
Iterator (oder Enumerator in MS-speak)

Hejlsberg hat wohl nur auf einem Ohr zugehört, als die Namen jener beiden Interfaces so und nicht anders festgelegt wurden - und dann kommt RemObjects daher und führt auch noch eine dritte Bezeichnung ein :stupid: .

[edit]Einmal Editieren ist dem Cache wohl zu wenig :stupid: .[/edit]

Elvis 22. Aug 2007 22:12

Re: Goto
 
Zitat:

Zitat von Khabarakh
Hejlsberg hat wohl nur auf einem Ohr zugehört, als die Namen jener beiden Interfaces so und nicht anders festgelegt wurden - und dann kommt RemObjects daher und führt auch noch eine dritte Bezeichnung ein :stupid:

sequences sind IEnumerable<T>, nur nicht so hässlich. Gab ja bereits "array of". :)

Khabarakh 22. Aug 2007 22:56

Re: Goto
 
Zitat:

Zitat von Elvis
sequences sind IEnumerable<T>, nur nicht so hässlich. Gab ja bereits "array of". :)

Ich weiß, auch wenn RemObjects das wohl irgendwie geheimhalten will *g* . Die Einführung eines neuen Keywords mit einer dritten Bezeichnung, das überhaupt nicht mehr mit den anderen zwei zusammenhängt, finde ich trotzdem nicht sinnvoll - wenn die C#-Generics zu hässlich sind, hätten sie sich gleich stattdessen an die VB-Syntax anlehnen sollen :duck: . Du musst zugeben, es würde doch auch niemand auf die Idee kommen, für stino Methoden wie Join() oder Select() Keywords einzuführen.

FAlter 22. Aug 2007 23:31

Re: Goto
 
Hi,

was hat das alles noch mit goto zu tun? :warn:

Mfg
FAlter

Hansa 23. Aug 2007 02:28

Re: Goto
 
Zitat:

Zitat von mkinzler
Wirths Pascal hatte kein goto. Wurde später aus einem mir unerklärlichen Grund
wieder eingeführt.

Doch, hatte es definitiv. Hawkeye hat da schon Recht. Das wurde weder abgeschafft noch neu eingeführt. Heutzutage wird nach Operator-Überladung usw. geschrien. Zur damaligen Zeit wurde eben GOTO gefordert. :P Den C-Sphagetti-Source kann man noch heute besichtigen. Lochkarten-Goto Basic-Code, der ist allerdings kaum noch zu finden. Obwohl,..VB ? :mrgreen:

Olli 23. Aug 2007 02:45

Re: Goto
 
Delphi-Quellcode:
goto Hell;
???? :mrgreen: :mrgreen: :mrgreen:

Hansa 23. Aug 2007 02:57

Re: Goto
 
Goto 3 ist doch schon viel besser. Die liegt hier vor mir auf dem Tisch. Wetten ? :mrgreen:

inherited 23. Aug 2007 21:43

Re: Goto
 
Zitat:

Zitat von Futurama
10 sin
20 goto hell

Robotology ist schon eine feine Sache :mrgreen:

calculon 23. Aug 2007 22:13

Re: Goto
 
*auch OT-Senf dazu abgeben will*

http://www.c64-wiki.de/images/thumb/...-Sweethome.gif

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