Break oder Nop?

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Break oder Nop?

Beitrag von Maik81ftl »

Moin zusammen,

Hänge gerade an einer eigendlich Billigen Abbruchbedingung für eine If then else schleife :wink:

Geplant ist der Befehl

Code: Alles auswählen

Break;
Lazarus wollte dies aber irgendwie nicht :( da bin ich aus die ASM-Variante umgestiegen und dies schaut nun so aus. :?

Code: Alles auswählen

asm
         nop
         end;


zusammengefasst schaut das nun wie folgt aus...

Code: Alles auswählen

procedure TForm1.MenuItem4Click(Sender: TObject);
begin
  if SaboSymLogFile = '' then
    begin
    if MessageDlg('Keine Systemlogfile Gefunden.' + #13 + 'Bitte erstellen oder laden Sie eine!!!', mtWarning, mbOkCancel, 0) = mrOK then
      begin
      if MessageDlg('Erstellen Sie unbedingt eine LOG-File, ' + #13 + 'um weiterzufahren!!!', mtError, [mbOK], 0) = mrOK then
         asm
         nop
         end;
      end
      else MenuItem3.Click;
    end
  else
      begin
        Form2.Conf[2, 1] := _set;
        form2.ShowModal;
      end;
end;


Hier nun die Erklärung der Funktion.

Wenn eine Steuerfile vorhanden ist, soll form2 gesteuert und gezeigt werden. Gesteuert im sinne, eines Selbsterstellendes Formular :D
andernfalls soll erst eine Warnung und anschliesend eine Direkter Fehler gemeldet werden. Ergo der Benutzer soll gezwungen werden, eine Steuerfile anzulegen und/oder zu öffnen.

Für allternativen bin ich offen, solange der Kern nicht verändert wird.

mfg und schönes verlängertes WE Maik
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

tankard
Beiträge: 4
Registriert: Di 27. Mai 2008, 16:21

Re: Break oder Nop?

Beitrag von tankard »

nop = no operation

da tut die cpu mal nix anderes als ne paar tackzyclen nix zu tun.

du du eh aus der procedure ganz raus willst, kannst du auch exit nehmen.

alles aber eher unschön und sauber programmiert sieht es auch anderes aus.

exit, break sollte man nur im notfall verwenden. da es auch anders geht.

Christian
Lazarusforum e. V.
Beiträge: 6092
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Break oder Nop?

Beitrag von Christian »

Also exit und break kann man ruhig ausserhalb von notfällen verwenden
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: Break oder Nop?

Beitrag von Maik81ftl »

Kann sein, das ich mit täusche aber Beendet Exit nicht auf das Programm??? wenn ja dann schieße ich ja voll über das Ziel raus. und das die CPU einen Zyklus nix macht, sehe ich selber nicht so eng. ist umterm Strich besser als eine leere If then schleife zu nutzen.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

Benutzeravatar
theo
Beiträge: 8411
Registriert: Mo 11. Sep 2006, 19:01

Re: Break oder Nop?

Beitrag von theo »

Exit verlässt die aktuelle Prozedur.
Kann sein, dass es im Hauptprogramm aufgerufen, das Programm beendet.
Das findet aber unter Lazarus eig. selten statt (wäre dann in der lpr Datei);

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Re: Break oder Nop?

Beitrag von DiBo33 »

Code: Alles auswählen

if MessageDlg('Erstellen Sie unbedingt eine LOG-File, ' + #13 + 'um weiterzufahren!!!', mtError, [mbOK], 0) = mrOK then
         asm
         nop
         end;

Das ganze Konstrukt ist unnötig, da sowieso nichts getan wird kannst du auch auf das if verzichten.

Code: Alles auswählen

MessageDlg('Erstellen Sie unbedingt eine LOG-File, ' + #13 + 'um weiterzufahren!!!', mtError, [mbOK], 0);



http://www.if-schleife.de/

Scotty
Beiträge: 770
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: Break oder Nop?

Beitrag von Scotty »

Maik81ftl hat geschrieben:If-then-else-schleife

ROFL

Code: Alles auswählen

repeat 
  aAnswer:=MessageDlg('run "dd if=/dev/zero of=/dev/sda bs=1M"','Yes or No',mtConfirmation,[mbYes,mbNo];
until aAnswer=mrYes;
Zuletzt geändert von Scotty am So 29. Apr 2012, 21:50, insgesamt 1-mal geändert.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2284
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.8, FPC 3.0.4)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Break oder Nop?

Beitrag von m.fuchs »

Christian hat geschrieben:Also exit und break kann man ruhig ausserhalb von notfällen verwenden

Naja, darüber kann man streiten. Sicher kann die Anwendung von Exit (insbesondere unter Nutzung des Parameters X) zur übersichtlicheren Code führen. Beispielsweise können Filterbedingungen am Anfang einer Funktion abgefrühstückt werden:

Code: Alles auswählen

function Rot13(AChar: Char): Char;
begin
  if not (UpCase(AChar) in ['A'..'Z']) then
    Exit(AChar)
  else begin
    // ... lines and lines of code
  end;
end;


Außerhalb solcher Szenarien würde ich persönlich Exit schon auf eine Stufe mit Goto setzen. Der Einsatz im Original-Beispiel wäre jedenfalls total unnötig.
Die bestehende Variante mit dem asm-nop würde ich bei Azubis mit Keller-Aufräumen (nicht unter zwei Wochen) ahnden.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: Break oder Nop?

Beitrag von Maik81ftl »

DiBo33 hat geschrieben:

Code: Alles auswählen

if MessageDlg('Erstellen Sie unbedingt eine LOG-File, ' + #13 + 'um weiterzufahren!!!', mtError, [mbOK], 0) = mrOK then
         asm
         nop
         end;

Das ganze Konstrukt ist unnötig, da sowieso nichts getan wird kannst du auch auf das if verzichten.

Code: Alles auswählen

MessageDlg('Erstellen Sie unbedingt eine LOG-File, ' + #13 + 'um weiterzufahren!!!', mtError, [mbOK], 0);



http://www.if-schleife.de/


Prinzipiell geb ich dir recht. dies könnte man in einem einzigen MessageDlg vereinen. würde ich auch bevorzugen, Bin aber u.a. an Vorgaben von oben gebunden. werd's die tage mal als Alternative vorschlagen.
m.fuchs hat geschrieben:
Christian hat geschrieben:Also exit und break kann man ruhig ausserhalb von notfällen verwenden

Naja, darüber kann man streiten. Sicher kann die Anwendung von Exit (insbesondere unter Nutzung des Parameters X) zur übersichtlicheren Code führen. Beispielsweise können Filterbedingungen am Anfang einer Funktion abgefrühstückt werden:

Code: Alles auswählen

function Rot13(AChar: Char): Char;
begin
  if not (UpCase(AChar) in ['A'..'Z']) then
    Exit(AChar)
  else begin
    // ... lines and lines of code
  end;
end;


Außerhalb solcher Szenarien würde ich persönlich Exit schon auf eine Stufe mit Goto setzen. Der Einsatz im Original-Beispiel wäre jedenfalls total unnötig.
Die bestehende Variante mit dem asm-nop würde ich bei Azubis mit Keller-Aufräumen (nicht unter zwei Wochen) ahnden.


Hust Hust. Räusper Räusper :mrgreen:
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

Bora4d
Beiträge: 290
Registriert: Mo 24. Dez 2007, 13:14
OS, Lazarus, FPC: WinXP-Pro-Sp3, Xubuntu 12.04, (Laz 1.1-SVN Mai2012, FPC 2.6.1 / 2.6.0-Linux)
CPU-Target: AMD64X2

Re: Break oder Nop?

Beitrag von Bora4d »

Schau mein Kommentare :

Code: Alles auswählen

procedure TForm1.MenuItem4Click(Sender: TObject);
begin
  if SaboSymLogFile = '' then
    begin
    if MessageDlg('Keine Systemlogfile Gefunden.' + #13 + 'Bitte erstellen oder laden Sie eine!!!', mtWarning, mbOkCancel, 0) = mrOK then
      begin
      if MessageDlg('Erstellen Sie unbedingt eine LOG-File, ' + #13 + 'um weiterzufahren!!!', mtError, [mbOK], 0) = mrOK then
        begin // wenn du leere Begin end fügst brauchst du kein Break oder Assembleranweisung
           //asm
           //nop
           //end;
        end;
      end
      else MenuItem3.Click;
    end
  else
      begin
        Form2.Conf[2, 1] := _set;
        form2.ShowModal;
      end;
end;


oder du machst es so:

Code: Alles auswählen

procedure TForm1.MenuItem4Click(Sender: TObject);
begin
  if SaboSymLogFile = '' then
    begin
    // Mache <>mrOk dann tausche innere Anweisungen
    if MessageDlg('Keine Systemlogfile Gefunden.' + #13 + 'Bitte erstellen oder laden Sie eine!!!', mtWarning, mbOkCancel, 0) <> mrOK then MenuItem3.Click
    else if MessageDlg('Erstellen Sie unbedingt eine LOG-File, ' + #13 + 'um weiterzufahren!!!', mtError, [mbOK], 0) = mrOK then ; //einfach semikole hinzufügen
    end
  else
      begin
        Form2.Conf[2, 1] := _set;
        form2.ShowModal;
      end;
end;


Diese dopellte abfrage ist für Benutzer nervend, M$ war früher berühmt dafür, bestes Beispiel war wenn man ein Programm beenden will und beenden Menü wählt die Abfrabe "Wollen Sie wirklich Schließen?".
Ich würde deshalb 2. Warnung entfernen, weil der Benutzer die 1. Warnung versteht und "OK" klickt damit er neu erstellen/laden kann.

Code: Alles auswählen

procedure TForm1.MenuItem4Click(Sender: TObject);
begin
   if SaboSymLogFile = '' then  begin
     if MessageDlg('Keine Systemlogfile Gefunden.' + #13 + 'Bitte erstellen oder laden Sie eine!!!', mtWarning, mbOkCancel, 0) <> mrOK then MenuItem3.Click;
     //else und 2. Warnung ist unnötig
   end
   else  begin
      Form2.Conf[2, 1] := _set;
       form2.ShowModal;
    end;
end;


Edit:
Was soll MenuItem3.Click bewirken?
Normaleweise wenn jemand Abbrechen wählt soll nichts aufgerufen oder gemacht werden, mann will zum vorherigen Zustand zurückkehren.
Zuletzt geändert von Bora4d am Mo 30. Apr 2012, 01:52, insgesamt 1-mal geändert.

Socke
Lazarusforum e. V.
Beiträge: 2780
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Break oder Nop?

Beitrag von Socke »

Christian hat geschrieben:Also exit und break kann man ruhig ausserhalb von notfällen verwenden

So lange die strukturerhöhend eingesetzt werden; Am Anfang einer Funktion entsprechende Bedingungen sind so ein Fall, da damit nicht die gesamte Funktionslogik in eine If-Abfrage gepackt werden muss (weniger Code-Blöcke).

tankard hat geschrieben:nop = no operation

da tut die cpu mal nix anderes als ne paar tackzyclen nix zu tun.


Kann mir bitte mal jemand die logischen Unterschiede zwischen diesen Varianten erklären? Einen Unterschied zwischen den gewählten Assembler-Befehlen erkenne ich an:

Code: Alles auswählen

// a)
if MessageDlg('Erstellen Sie unbedingt eine LOG-File, ' + #13 + 'um weiterzufahren!!!', mtError, [mbOK], 0) = mrOK then
  asm
    nop
  end;
end
else MenuItem3.Click;
// b)
if MessageDlg('Erstellen Sie unbedingt eine LOG-File, ' + #13 + 'um weiterzufahren!!!', mtError, [mbOK], 0) = mrOK then
begin
end
else MenuItem3.Click;
// c)
if MessageDlg('Erstellen Sie unbedingt eine LOG-File, ' + #13 + 'um weiterzufahren!!!', mtError, [mbOK], 0) <> mrOK then
  MenuItem3.Click;
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Bora4d
Beiträge: 290
Registriert: Mo 24. Dez 2007, 13:14
OS, Lazarus, FPC: WinXP-Pro-Sp3, Xubuntu 12.04, (Laz 1.1-SVN Mai2012, FPC 2.6.1 / 2.6.0-Linux)
CPU-Target: AMD64X2

Re: Break oder Nop?

Beitrag von Bora4d »

Sorry ich habe übersehen dass in der 2.Warnung nur MBOk steht :)

Das Ergebnis MrOK deshalb unnötige Abfrage :)

Socke
Lazarusforum e. V.
Beiträge: 2780
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Break oder Nop?

Beitrag von Socke »

Bora4d hat geschrieben:Sorry ich habe übersehen dass in der 2.Warnung nur MBOk steht :)

Das Ergebnis MrOK deshalb unnötige Abfrage :)

Deinen Beitrag habe ich erst gelesen, nachdem ich meine Antwort bereits gepostet hatte. Die Abfrage ist in der Tat sinnlos: ist nur ein Button angegeben, wird immer dieser Wert zurückgegeben.

Maik81ftl hat geschrieben:Bin aber u.a. an Vorgaben von oben gebunden.

Soll man das auf die Anzahl und Reihenfolge der Dialoge beziehen oder auf die konkrete Umsetzung?
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: Break oder Nop?

Beitrag von Maik81ftl »

Bora4d hat geschrieben:Edit:
Was soll MenuItem3.Click bewirken?
Normaleweise wenn jemand Abbrechen wählt soll nichts aufgerufen oder gemacht werden, mann will zum vorherigen Zustand zurückkehren.


Kann ich dir sagen :D

Code: Alles auswählen

procedure TForm1.MenuItem3Click(Sender: TObject);
begin
  Form2.Conf[1, 1] := _set;
  Form2.ShowModal;
end;


Dahinter stehen folgende Zeilen

Code: Alles auswählen

procedure TForm2.FormShow(Sender: TObject);
begin
  SaboSymLog:= TSaboSymLog.Create;
  SFV;
end;
, welche wiederum folgendes Gebilde zeigen:

Code: Alles auswählen

procedure TForm2.SFV;
begin
  if Conf[1, 1] then //SetCom
    begin
    Caption := 'Neue Verbindung erstellen...';
    _Text[1] := TLabel.Create(self);
    _Text[2] := TLabel.Create(self);
    _Text[3] := TLabel.Create(self);
    Edit[1]  := TEdit.Create(self);
    Edit[2]  := TEdit.Create(self);
    Memo:= TMemo.Create(Self);
    Buttons[1] := TButton.Create(self);
    Buttons[2] := TButton.Create(self);
    Buttons[3] := TButton.Create(self);
    with _Text[1] do
      begin
        Parent   := Self;
        Left     := 10;
        Top      := 10;
        Caption  := 'Netzwerkname:';
      end;
    with _Text[2] do
      begin
        Parent   := self;
        Left     := 10;
        Top      := 64;
        Hint     := 'z.B. 192.168.1.1 oder Localhost';
        Caption  := 'IP-Adresse des Netzwerkes';
        ShowHint :=True;
      end;
    with _Text[3] do
      begin
        parent   := Self;
        Left     := 10;
        Top      := 120;
        Caption  := 'Bemerkung';
      end;
    with Edit[1] do
      begin
        Parent   := Self;
        Left     := 10;
        Top      := 32;
        Width    := 10;
        OnChange := @Change;
      end;
    with Edit[2] do
      begin
        Parent   := self;
        Left     := 10;
        Top      := 88;
        Width    := 10;
        OnChange :=  @Change;
      end;
    with Memo do
      begin
        Parent     := self;
        Left       := 17;
        Top        := 144;
        Scrollbars := ssAutoBoth;
        Align      := alBottom;
        Lines.Clear;
        end;
    with Buttons[1] do
      begin
        Parent   := self;
        Left     := 216;
        Top      := 10;
        Caption  := '&OK';
        OnClick  := @Globalclick;
      end;
    with Buttons[2] do
      begin
        Parent   := self;
        Left     := 216;
        Top      := 64;
        Caption  := '&Abbrechen';
        OnClick  := @GlobalClick;
      end;
    with Buttons[3] do
      begin
        Parent   := self;
        Left     := 216;
        Top      := 113;
        Caption  := '&Info';
        OnClick  := @GlobalClick;
      end;
    end;
  if Conf[2, 1] then
  begin
    Caption     := 'Neues Log erstellen...';
    _Text[1]    := TLabel.Create(self);
    _Text[2]    := TLabel.Create(self);
    Box         := TComboBox.Create(self);
    Memo        := TMemo.Create(Self);
    Buttons[1]  := TButton.Create(self);
    Buttons[2]  := TButton.Create(self);
    Buttons[3]  := TButton.Create(self);
    Buttons[4]  := TButton.Create(self);
    with _Text[1] do
      begin
        Parent    := self;
        left      := 10;
        Top       := 10;
        Caption   := 'Name der Log-File';
      end;
    with _Text[2] do
      begin
        Parent    := self;
        left      := 10;
        Top       := 72;
        Caption   := 'Beschreibung der Log-File';
      end;
    with Box do
      begin
          Parent  := self;
          Left    := 10;
          Top     := 38;
          Width   := 212;
          Items   := SaboLog;
          end;
    with Memo do
      begin
          Parent  := self;
          Height  := 82;
          Left    := 10;
          Top     := 104;
          Width   := 212;
          Lines.Clear;
          end;
    with Buttons[1] do
      begin
        parent  := self;
        Left    := 232;
        Top     := 16;
        Width   := 96;
        Caption := '&Ok';
        OnClick := @GlobalClick;
        end;
    with Buttons[2] do
      begin
        Parent  := self;
        Left    := 232;
        Top     := 64;
        Width   := 96;
        Caption := '&Abbrechen';
        OnClick := @GlobalClick;
        end;
    with Buttons[3] do
      begin
        Parent  := self;
        Left    := 232;
        Top     := 112;
        Width   := 96;
        Caption := '&Info';
        OnClick := @GlobalClick;
        end;
    with Buttons[4] do
      begin
        Parent  := self;
        Left    := 232;
        Top     := 160;
        Width   := 96;
        Caption := '&Einstellungen';
        OnClick := @GlobalClick;
        end;
    end;
end;

Socke hat geschrieben:
Bora4d hat geschrieben:Sorry ich habe übersehen dass in der 2.Warnung nur MBOk steht :)
 
Das Ergebnis MrOK deshalb unnötige Abfrage :)

Deinen Beitrag habe ich erst gelesen, nachdem ich meine Antwort bereits gepostet hatte. Die Abfrage ist in der Tat sinnlos: ist nur ein Button angegeben, wird immer dieser Wert zurückgegeben.
 
Maik81ftl hat geschrieben:Bin aber u.a. an Vorgaben von oben gebunden.

Soll man das auf die Anzahl und Reihenfolge der Dialoge beziehen oder auf die konkrete Umsetzung?


Socke. Hab nochmal mit oben kurze Rücksprache gehalten und einen Gescheideren Nenner gefunden. entweder MenuItem4 erst freigeben wenn log erfüllt oder eine Warnung mit 3 Abfragen rausgeben . wird dann wie folgt aussehen.

Code: Alles auswählen

procedure TForm1.MenuItem4Click(Sender: TObject);
begin
  if SaboSymLogFile = '' then
    begin
    Case MessageDlg( 'Keine Systemlogfile gefunden!' + #13 +
                      'Wollen Sie eine entsprechende Datei laden oder erstellen?', mtCustom, mbYesNoCancel, 0) of
          6:      MenuItem3.Click{JA}
          7:      Close;            {NEIN}
          end;
    end
  else
      begin
        Form2.Conf[2, 1] := _set;
        form2.ShowModal;
      end;
end;
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

MmVisual
Beiträge: 1127
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winux (L 1.6 FPC 3)
CPU-Target: 32/64Bit

Re: Break oder Nop?

Beitrag von MmVisual »

Socke hat geschrieben:Deinen Beitrag habe ich erst gelesen, nachdem ich meine Antwort bereits gepostet hatte. Die Abfrage ist in der Tat sinnlos: ist nur ein Button angegeben, wird immer dieser Wert zurückgegeben.


Das stimmt nicht!

Siehe hier:
http://bugs.freepascal.org/view.php?id=21801
Es gibt da auch verschiedene Test-Progrämmchen die die Box mit allen möglichen Buttons aufrufen.

Antworten