Funktionverknüpfung mit and

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Olga
Beiträge: 2
Registriert: Di 3. Mai 2011, 17:29

Funktionverknüpfung mit and

Beitrag von Olga »

Hallo!
Habe folgendes Problem:
Will einen Befehl mit 2 Bedingungen machen... Von früher bin ich der Meinung, dass ich das ja mit einem And verknüpfen muss...
Leider weiß ich nciht mehr, wie das geht :oops: Habe es mit Klammern setzen probiert, ging auch nicht... :?
Kann mir da einer helfen?

Code: Alles auswählen

If g:=26 and h:=4 then g:=19;
If g:=25 and h:=4 and d:=28 and e:=6 and a<10 then g:=18;
Schon mal Danke :)
Zuletzt geändert von Lori am Do 5. Mai 2011, 00:34, insgesamt 1-mal geändert.
Grund: Highlighter

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6766
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Funktionverknüpfung mit and

Beitrag von af0815 »

Olga hat geschrieben:Kann mir da einer helfen?
= ist eine Vergleichsoperation
:= ist eine Zuweisungsoperation

Code: Alles auswählen

If g=26 and h=4 then g := 19;
If g=25 and h=4 and d=28 and e=6 and a<10 then g := 18;
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Lannes
Beiträge: 13
Registriert: Mo 16. Nov 2009, 22:14
OS, Lazarus, FPC: Windows XP, D3..D2010, Lazarus
CPU-Target: 32 Bit

Re: Funktionverknüpfung mit and

Beitrag von Lannes »

Hallo,

noch ein paar Klammern dazu, dann passt es: :wink:

Code: Alles auswählen

if (g = 26) and (h = 4) then 
  Foo;
(Nichts ist nicht Nichts) and (''<>nil)and(Pointer('')=nil)and(@('')<>nil)

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: Funktionverknüpfung mit and

Beitrag von Maik81ftl »

Lannes hat geschrieben:Hallo,

noch ein paar Klammern dazu, dann passt es: :wink:

Code: Alles auswählen

if (g = 26) and (h = 4) then 
  Foo;
aus reiner sicherheit kann man des aber auch so schreiben. macht zwar weniger sind, ich finde es aber für mich selber am Sichersten.

Code: Alles auswählen

if ((g = 26) and (h = 4)) then 
  Foo;
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

Olga
Beiträge: 2
Registriert: Di 3. Mai 2011, 17:29

Re: Funktionverknüpfung mit and

Beitrag von Olga »

Vielen Dank!
Jetzt funktioniert alles wunderbar =)

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Funktionverknüpfung mit and

Beitrag von MAC »

ich kann maik nur zustimmen. Lieber gleich angewöhnen viel klammern zu schreiben als die irgendow zu vergessen. Den Fehler findet man sonnst nie :)

Code: Alles auswählen

Signatur := nil;

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1617
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Funktionverknüpfung mit and

Beitrag von corpsman »

Ergänzend sei noch die Short Circuit Evaluation genannt.

Wenn du in deinem and Funktionen aufrufst, welche Nebeneffekte haben, werden diese evtl nicht gesetzt.

Ein Beispiel :

Code: Alles auswählen

var a:array[0..4] of boolean;
      i:integer;
begin
..
i := 5;
if (i <= high(a)) and (a[i]) then 
  Foo;
Ist Erlaubt, da die Short Circuit Evaluation a nicht auswertet, da ja (i<= high(a)) bereits false war. Hier sind auch keine Nebeneffekte, machst du stattdesen aber folgendes :

Code: Alles auswählen

var globalnumber:integer;
 
function a():Boolean;
begin
 globalnumber := globalnumber + 1;
// Ermittlung des Ergebnisses unbekannt
end;
 
funktion b():boolean;
begin
  globalnumber := globalnumber * 2;
end;
 
begin
 globalnumber := 1;
 if a() and b() then foo();
  Bar();
Greift nun Bar() auf globalnumber zu und gehen wir davon aus das Foo(); globalnumber nicht verändert, so sind für globalnumber die Werte 2 und 4 möglich...
--
Just try it

Socke
Lazarusforum e. V.
Beiträge: 3177
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: Funktionverknüpfung mit and

Beitrag von Socke »

corpsman hat geschrieben:Ergänzend sei noch die Short Circuit Evaluation genannt.

Wenn du in deinem and Funktionen aufrufst, welche Nebeneffekte haben, werden diese evtl nicht gesetzt.
Meiner Meinung nach sollte man darauf nur bei trivialen Nebeneffekten (String-, Array-, Listengrenzen) aufbauen. Bei komplexeren Nebeneffekten sollte man sich schon die Mühe machen einfacher zu verstehenden Quelltext zu schreiben.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Eclipticon
Beiträge: 292
Registriert: Sa 5. Feb 2011, 20:38
OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
CPU-Target: 32Bit
Wohnort: Wien

Re: Funktionverknüpfung mit and

Beitrag von Eclipticon »

corpsman hat geschrieben:

Code: Alles auswählen

var a:array[0..4] of boolean;
      i:integer;
begin
..
i := 5;
if (i <= high(a)) and (a[i]) then 
  Foo;
Ist Erlaubt, da die Short Circuit Evaluation a[ i ] nicht auswertet, da ja (i<= high(a)) bereits false war.
Irre ich mich, oder ist die Reihenfolge, in der die Ausdruecke ausgewertet werden nicht undefiniert? Ich kann mich dunkel erinnern, gelesen zu haben, dass die Auswertung durchaus auch beim letzten Ausdruck beginnen (und damit auch abbrechen) kann.

Ein Grund mehr, sehr vorsichtig damit zu sein ...
Zuletzt geändert von Eclipticon am Mi 4. Mai 2011, 16:58, insgesamt 1-mal geändert.

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

Re: Funktionverknüpfung mit and

Beitrag von theo »

Eclipticon hat geschrieben: Irre ich mich, oder ist die Reihenfolge, in der die Ausdruecke ausgewertet werden nicht undefiniert? Ich kann mich dunkel erinnern, gelesen zu haben, dass die Auswertung durchaus auch beim letzten Ausdruck beginnen (und damit auch abbrechen) kann.
Da irrst du dich imho. Sonst macht ja {$B-} keinen Sinn:
http://www.freepascal.org/docs-html/prog/progsu4.html" onclick="window.open(this.href);return false;

Eclipticon
Beiträge: 292
Registriert: Sa 5. Feb 2011, 20:38
OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
CPU-Target: 32Bit
Wohnort: Wien

Re: Funktionverknüpfung mit and

Beitrag von Eclipticon »

Nun ja, prinzipiell koennte man folgendes schon so interpretieren:
 

Code: Alles auswählen

Die Reihenfolge, in der die Ausdruecke der selben mathematischen Prioritaet ausgewertet werden, geht nicht immer unbedingt von rechts nach links [sic!]. Grundsaetzlich darf nicht von einer gesicherten Reihenfolge bei der Bearbeitung ausgegangen werden. [...] Deshalb kann im folgenden Ausdruck
 
a:= g(3) + f(2);
 
f(2) vor g(3) ausgefuehrt werden. Dieses Verhalten weicht von dem von Delphi und Turbo Pascal ab.
(van Canneyt, Free Pascal 2, p. 223)

Auf der anderen Seite ... das widerspricht etwas der Dokumentation und der Intention von {$Bx} ... wird in diesem Fall also wohl schon der Reihe nach erfolgen.

Socke
Lazarusforum e. V.
Beiträge: 3177
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: Funktionverknüpfung mit and

Beitrag von Socke »

Eclipticon hat geschrieben:Irre ich mich, oder ist die Reihenfolge, in der die Ausdruecke ausgewertet werden nicht undefiniert? Ich kann mich dunkel erinnern, gelesen zu haben, dass die Auswertung durchaus auch beim letzten Ausdruck beginnen (und damit auch abbrechen) kann.
Das habe ich auch mal gelesen. In dem ursprünglichen Pascal-Dialekt von N.Wirth war das auch so definiert um dem Compiler diverse Optimierungen zu ermöglichen; in der Free Pascal-Dokumentation finde ich aber kein Wort dazu (also ist hier das Verhalten bei {$B-} nicht dokumentiert und nicht einfach alles der Reihe nach!).
Meine Interpretation wäre, dass beides gleichzeitig trotzdem gültig ist, da der Compiler sich auch dafür entscheiden kann alles in der Reihenfolge des Quelltextes auszuwerten. Das wäre dann in etwa der Unterschied zwischen Sprachdefinition und Implementation durch den Compiler.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

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

Re: Funktionverknüpfung mit and

Beitrag von theo »

Ich kann nur sagen, dass ich bisher immer davon ausgegangen bin, dass {$B-} von LnR arbeitet, und ich hatte nie ein Problem damit (FPC und Delphi).
Hier steht's dann auch noch explizit:
In the {$B-} state, the compiler generates code for short-circuit Boolean expression evaluation, which means that evaluation stops as soon as the result of the entire expression becomes evident in left to right order of evaluation.
http://docs.embarcadero.com/products/ra ... n_xml.html" onclick="window.open(this.href);return false;

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: Funktionverknüpfung mit and

Beitrag von carli »

Eclipticon hat geschrieben:Nun ja, prinzipiell koennte man folgendes schon so interpretieren:
 

Code: Alles auswählen

Die Reihenfolge, in der die Ausdruecke der selben mathematischen Prioritaet ausgewertet werden, geht nicht immer unbedingt von rechts nach links [sic!]. Grundsaetzlich darf nicht von einer gesicherten Reihenfolge bei der Bearbeitung ausgegangen werden. [...] Deshalb kann im folgenden Ausdruck
 
a:= g(3) + f(2);
 
f(2) vor g(3) ausgefuehrt werden. Dieses Verhalten weicht von dem von Delphi und Turbo Pascal ab.
(van Canneyt, Free Pascal 2, p. 223)

Auf der anderen Seite ... das widerspricht etwas der Dokumentation und der Intention von {$Bx} ... wird in diesem Fall also wohl schon der Reihe nach erfolgen.
Für den Fall "AND" und "OR" macht es ja auch Sinn, das ganze in seiner Reihenfolge zu belassen.
Und ja, es sei dir zugesichert, dass bei AND und OR immer die linke Seite zuerst ausgeführt wird und (sofern nicht anders umgestellt) die rechte Seite je nach Bedarf auch wegfällt.

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: Funktionverknüpfung mit and

Beitrag von Maik81ftl »

MAC hat geschrieben:ich kann maik nur zustimmen. Lieber gleich angewöhnen viel klammern zu schreiben als die irgendow zu vergessen. Den Fehler findet man sonnst nie :)
lach hab ich mir schon in Basic angewöhnt bei TP beigehalten, bei µC war's zum Teil ein Zwang :D

ergo arbeite schon aus Prinzip so... Nur schade, das ich bei anderen Sachen net so konsquent bin.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

Antworten