Delphi-PRAXiS
Seite 8 von 10   « Erste     678 910      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi goto-befehl in delphi? (https://www.delphipraxis.net/73851-goto-befehl-delphi.html)

Peinhard 26. Jul 2006 11:20

Re: goto-befehl in delphi?
 
Zitat:

Zitat von mkinzler
Eine Forschleife sollte man auch nicht abbrechen müssen, sonst würde ich halt ne while-Schleife nehmen mit den 2 Bedingungen.

Naja, die VCL ist jedenfalls voll davon:

Delphi-Quellcode:
function TFields.FindField(const FieldName: string): TField;
var
  I: Integer;
begin
  for I := 0 to FList.Count - 1 do
  begin
    Result := FList.Items[I];
    if AnsiCompareText(Result.FFieldName, FieldName) = 0 then Exit;
  end;
  Result := nil;
end;
um nur ein Beispiel von vielen zu nehmen...

alcaeus 26. Jul 2006 11:28

Re: goto-befehl in delphi?
 
:shock: Sowas:
Delphi-Quellcode:
Start:              //Label Start
readln(f,Daten);    //Aus File in die Variable DATEN Zeile einlesen
if not EOF(f) then if daten:='' then goto Start; //Daten ist leer, kein EOF also springe ich zu Start.
geht auch so:

Delphi-Quellcode:
Daten := '';
repeat
  readln(f, Daten);
until EOF(f) or (Daten <> '');
Greetz
alcaeus

Go2EITS 26. Jul 2006 11:31

Re: goto-befehl in delphi?
 
@MKinzler
Du weichst vom Thema ab MKinzler! (ERMAHN!) :-D

Meine Lösung scheint wohl OK zu sein. In Assembler gibt es ja auch Sprünge in dieser
Art. Und ein EXIT, wenn in der Funktion das Result natürlich gesetzt wurde, bevor nochmals
viele IF's abgearbeitet werden müssen verwende ich auch. In einer Procedure ebenso, wenn
das Ergebnis erziehlt wurde. Ich setze GOTO und EXIT dann ein, um den Code nicht zu komplizieren.
Break setze ich ungern ein. Geschmackssache eben, aber bevor ich eine umfangreiche Schleife mit
100.000 Durchläufen in den ersten 1000 Durchläufen beenden kann, könnte BREAK helfen. Manchmal ist es der Performance behilflich.

@alcaeus
Gute Lösung.
Ich habe aber nicht nur ein Daten:="" sondern auch:
...lesen der Daten aus File
Delphi-Quellcode:
Daten:=Trim(daten);
if daten[1]:='/' then goto Start;
if Daten[1]:='#'then goto Start;
if pos('C:\',daten) >0 then goto Start;
[edit]
Und hier stehen noch weiter Codes zum Verarbeiten des DATEN Strings,
zum Beispiel
showmessage('Daten: ',DATEN);
etc...
etc..

Und das soll ich in
until EOF(f) or (Daten <> '').... packen?

Ich mag es nicht so. Und meinen Fehler habe ich gesehen: if EOF(f) und nicht not EOF(f). Korrigiert, damit jemand es nicht falsch nachahmt. Und es stellt sich die Frage, was wirklich schneller ist.
(Wahrscheinlich keines von beiden, weil der Compilercode wohl gleich ist.)

[edit=alcaeus]Delphi-Tags eingefuegt ;) Mfg, alcaeus[/edit]

mkinzler 26. Jul 2006 11:36

Re: goto-befehl in delphi?
 
Ich hatte deinen Code als Witz aufgefasst, du meinst das also ernst? :o

Zitat:

in Assembler gibt es ja auch Sprünge in dieser Art.
Da der Prozessor keine strukturierten Elemente kennt.
Zitat:

Ich setze GOTO und EXIT dann ein, um den Code nicht zu komplizieren.
Wenn du ihn so einsetzt, wie in deinem Beispiel schon.

BTW: Ein funktionierender Code ist noch lang kein guter Code.

Go2EITS 26. Jul 2006 11:41

Re: goto-befehl in delphi?
 
@MKinzler
War ernst... :oops: Beispiel oben um realen Einsatz geändert.
Sollte ich vielleicht CASE nehmen?

mkinzler 26. Jul 2006 11:50

Re: goto-befehl in delphi?
 
Dann solltest du dir norchmal die Grundlagen strukturierter Programmierung reinziehen.

[Edit]
Zitat:

Sollte ich vielleicht CASE nehmen?
Nein While oder Repeat; siehe auch Beitrag 72 von alcaeus [/edit]

Go2EITS 26. Jul 2006 12:20

Re: goto-befehl in delphi?
 
@MKinzler
:warn:

Ne, Spass beiseite.
Also, nun muss ich es wohl doch mit GOTO lösen:
Delphi-Quellcode:
Result:=False;
Daten:='';
repeat
readln(f, Daten);
Daten:=Trim(daten);
if Daten:=chr(13)+Chr(10) then goto ENDE; // LF
if Daten:='' then goto ENDE;             //Leerraum
if daten[1]:='/' then goto ENDE;         //Kommentarzeile
Daten[1]:='#'then goto ENDE;             //Kommentarzeile
pos('C:\',daten) >0 then goto ENDE;      //Rootverzeichnis
//Und hier stehen noch weitere Codes zum Verarbeiten des DATEN Strings
showmessage(Daten);                      //Zum debuggen
If pos('DEBUG',DATEN) >0 then            //Die erste Verarbeitung...
   begin
   RESULT:=TRUE; //Wir haben ja etwas gültiges gefunden...  
   //CODE hier
   end;
// Hier stehen nochmals einige IF mit entsprechender Verarbeitung

ENDE:
until EOF(f);
Muss ich nochmal die Grundlagen strukturierter Datenverarbeitung lesen?
Verbessere bitte meinen Code. Wie kann ich es eleganter machen?
Ich lerne gerne dazu, bzw. verbessere meinen Programmierstil (Ernst gemeint!)
Und statt IF's CASE zu nehmen dürfte das "GOTO-Problem" auch nicht lösen.

sakura 26. Jul 2006 12:27

Re: goto-befehl in delphi?
 
:shock:

Bei ReadLn wird die Bedingung Daten = chr(13)+Chr(10) nie auftreten, da der Zeilenumbruch nicht zurück geliefert wird, sondern nur ein leerer String. Aber mal zum Wesentlichen:

Delphi-Quellcode:
Result := False;
repeat
  readln(f, Daten);
  Daten := Trim(daten);
  if Daten <> '' then
    if not (Daten[1] in ['/', '#']) then
      if Pos('C:\', Daten) = 0 then
      begin
        showmessage(Daten);                      //Zum debuggen
        If pos('DEBUG',DATEN) >0 then            //Die erste Verarbeitung...
        begin
          RESULT:=TRUE; //Wir haben ja etwas gültiges gefunden...  
         //CODE hier
        end;
      end;
until EOF(f);
Zitat:

Muss ich nochmal die Grundlagen strukturierter Datenverarbeitung lesen?
Ja :shock:

...:cat:...

Michael Habbe 26. Jul 2006 12:33

Re: goto-befehl in delphi?
 
Zitat:

Zitat von Go2EITS
Muss ich nochmal die Grundlagen strukturierter Datenverarbeitung lesen?
Verbessere bitte meinen Code. Wie kann ich es eleganter machen?
Ich lerne gerne dazu, bzw. verbessere meinen Programmierstil (Ernst gemeint!)
Und statt IF's CASE zu nehmen dürfte das "GOTO-Problem" auch nicht lösen.

Hallo, ich habe ihn mal überarbeitet. Du solltest gleiche Elemente zusammenfassen (hier mit or geschehen). Die Performance leidet nicht darunter, weil, wenn die erste Bedingung erfüllt wird, werden die anderen nicht mehr überprüft.
Delphi-Quellcode:
Result:=False;
Daten:='';
repeat
  readln(f, Daten);
  Daten:=Trim(daten);
  if (Daten=chr(13)+Chr(10)) or
     (Daten='') or
     (daten[1]='/') or
     (Daten[1]='#') or
     (pos('C:\',daten) >0) then
  begin
    // tue hier irgendwas
    // wenn nichts geschehen soll, lass diese Stelle
    // einfach leer, vielleicht brauchst Du es später
    // so wird gleich ersichtlich, dass nichts
    // geschehen soll, wenn diese Bedingung erfüllt ist
  end
  else
  begin
    //Und hier stehen noch weitere Codes zum Verarbeiten des DATEN Strings
    showmessage(Daten);
    If pos('DEBUG',DATEN) >0 then
    begin
      RESULT:=TRUE; //Wir haben ja etwas gültiges gefunden...
      //CODE hier
    end;
    // Hier stehen nochmals einige IF mit entsprechender Verarbeitung
  end;
until EOF(f);

himitsu 26. Jul 2006 12:35

Re: goto-befehl in delphi?
 
Zitat:

Zitat von Go2EITS
Delphi-Quellcode:
Result:=False;
Daten:='';
repeat
readln(f, Daten);
Daten:=Trim(daten);
if Daten:=chr(13)+Chr(10) then goto ENDE; // LF
if Daten:='' then goto ENDE;             //Leerraum
if daten[1]:='/' then goto ENDE;         //Kommentarzeile
Daten[1]:='#'then goto ENDE;             //Kommentarzeile
pos('C:\',daten) >0 then goto ENDE;      //Rootverzeichnis
//Und hier stehen noch weitere Codes zum Verarbeiten des DATEN Strings
showmessage(Daten);                      //Zum debuggen
If pos('DEBUG',DATEN) >0 then            //Die erste Verarbeitung...
   begin
   RESULT:=TRUE; //Wir haben ja etwas gültiges gefunden...  
   //CODE hier
   end;
// Hier stehen nochmals einige IF mit entsprechender Verarbeitung

ENDE:
until EOF(f);
Und statt IF's CASE zu nehmen dürfte das "GOTO-Problem" auch nicht lösen.

Und der Code läuft?

Bei den fehlen IFs und den := für Vegleiche kann ich es mir ja nicht so vorstellen :roll:

CASE für die IFs wäre eh nicht möglich, da CASE in Delphi nur mit Ordinalen Typen klarkommt und denmach für die Auswerdung von Strings vollkommen (ohne Hilfsmittel zur Konvertierung) ungeeignet ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:10 Uhr.
Seite 8 von 10   « Erste     678 910      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz