Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Kleine Verständnisfrage in Bezug auf IF-Funktion
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Type



Anmeldungsdatum: 24.02.2006
Beiträge: 187
Wohnort: Dresden

BeitragVerfasst am: 13.01.2009, 15:54    Titel: Kleine Verständnisfrage in Bezug auf IF-Funktion Antworten mit Zitat

Hallo Leute,
ich habe mal eine kleine Verständnisfrage:

Code:
DIM AS INTEGER a, b
a = 1
b = 1

IF a = 1 OR b = 1 THEN
'Code...
END IF


Wenn a true ist, wird doch b gar nicht erst überprüft, oder?

MfG Type
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4699
Wohnort: ~/

BeitragVerfasst am: 13.01.2009, 16:07    Titel: Antworten mit Zitat

Doch, wird es. Ansonsten musst du (ab fbc 0.20) ORELSE verwenden.

(Hintergrund: binärer Vergleich im Sinne von "a OR 7" soll ja nicht abbrechen.)
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Type



Anmeldungsdatum: 24.02.2006
Beiträge: 187
Wohnort: Dresden

BeitragVerfasst am: 13.01.2009, 17:16    Titel: Antworten mit Zitat

Alles klar, danke für die Info grinsen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
frebas



Anmeldungsdatum: 20.06.2008
Beiträge: 245

BeitragVerfasst am: 13.01.2009, 17:33    Titel: Antworten mit Zitat

Wenn du willst dass nicht immer auch noch die zweite bedingung geprüft wird wenn die erste schon nicht zustimmt kannst du einfach 2 IF....THEN Schleifen verschachteln.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 13.01.2009, 17:40    Titel: Antworten mit Zitat

das ist umständlich, sieht doof aus und ist durch ORELSE nicht mehr nötig.
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
frebas



Anmeldungsdatum: 20.06.2008
Beiträge: 245

BeitragVerfasst am: 13.01.2009, 17:58    Titel: Antworten mit Zitat

Jojo hat Folgendes geschrieben:
das ist umständlich, sieht doof aus und ist durch ORELSE nicht mehr nötig.

Also das aussehen hat doch eine sehr geringe Priorität-
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 13.01.2009, 18:01    Titel: Antworten mit Zitat

Hi,
eigentlich ist das nur für die Steigerung der ProgrammPerformance interessant?

Aber Vorsicht:
nur wen erster Ausdruck=true ist ORELSE schneller, bei erster Ausdruck=fals ist es sogar langsamer als einfaches OR!
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 13.01.2009, 18:18    Titel: Antworten mit Zitat

frebas hat Folgendes geschrieben:
Jojo hat Folgendes geschrieben:
das ist umständlich, sieht doof aus und ist durch ORELSE nicht mehr nötig.

Also das aussehen hat doch eine sehr geringe Priorität-

wer hat dir denn _den_ schrott eingetrichtert? nimm nen unformatierten sourcecode und einen mit kommentanren, einrückungen und gutem stil - und dann sag mir, welchen du nach nem jahr noch verstehst.
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 13.01.2009, 19:09    Titel: Antworten mit Zitat

frebas hat Folgendes geschrieben:
Wenn du willst dass nicht immer auch noch die zweite bedingung geprüft wird wenn die erste schon nicht zustimmt kannst du einfach 2 IF....THEN Schleifen verschachteln.


verschachteln is ja gut und schön, aber man sollte da auch drauf achten, das man nicht 100 IF Abfragen ineinander stackt, sonst is der stack schnell am ende. Auch wenn es ziemlich gross is, kostet es doch einiges an arbeit ihn zu puschen und popen. Da ist ein Goto manchmal sehr sinvoll.


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Type



Anmeldungsdatum: 24.02.2006
Beiträge: 187
Wohnort: Dresden

BeitragVerfasst am: 13.01.2009, 19:52    Titel: Antworten mit Zitat

volta hat Folgendes geschrieben:
nur wen erster Ausdruck=true ist ORELSE schneller, bei erster Ausdruck=fals ist es sogar langsamer als einfaches OR!


Wie kommt das denn?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4699
Wohnort: ~/

BeitragVerfasst am: 13.01.2009, 20:10    Titel: Antworten mit Zitat

Ich nehme an, weil bei ORELSE eine Entscheidung stattfinden muss, ob weitergeprüft werden soll oder nicht. OR muss diese Entscheidung nicht treffen.

Ein sinnvoller Einsatz, der nicht nur aus Performance-Gründen stattfindet wäre z. B.
Code:
DIM array(5) AS variablentyp
' ...
IF wert > 5 ORELSE array(wert) = 0 THEN ' ...

_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 13.01.2009, 20:10    Titel: Antworten mit Zitat

OR = eine rechenoperation
ORELSE mit erstem ausdruck true = eine rechenoperation
ORELSE mit erstem ausdruck false = zwei rechenoperationen
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 13.01.2009, 20:45    Titel: Antworten mit Zitat

OR ist ein bitweiser operator.
&b01011 OR &b01110 ergibt &b01111
ORELSE ist eine subroutine:
a ORELSE b wird "übersetzt" zu ner funktion im stil "if a then return a else return b", wobei ich nicht weiß, was hier mit zahlenwerten passieren würde wie im ersten beispiel, das verhalten stimmt so mindestens bei der interpretation der werte als wahrheitswerte, als zahlenwerte steht vermutlich in der doku und wenn nicht muss mans halt mal ausprobieren oder im fbc-source nachschauen ;p
_________________
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4699
Wohnort: ~/

BeitragVerfasst am: 13.01.2009, 20:58    Titel: Antworten mit Zitat

Laut "Herstellerinformation" wird jeder Ausdruck vor- und hinter dem ORELSE entweder zu 0 oder zu -1. "2 + 3 ORELSE 4" liefert z. B. den Rückgabewert -1. Es ist also eher ein
if a then return -1 elseif b then return -1 else return 0
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
frebas



Anmeldungsdatum: 20.06.2008
Beiträge: 245

BeitragVerfasst am: 13.01.2009, 21:48    Titel: Antworten mit Zitat

Jojo hat Folgendes geschrieben:
frebas hat Folgendes geschrieben:
Jojo hat Folgendes geschrieben:
das ist umständlich, sieht doof aus und ist durch ORELSE nicht mehr nötig.

Also das aussehen hat doch eine sehr geringe Priorität-

wer hat dir denn _den_ schrott eingetrichtert? nimm nen unformatierten sourcecode und einen mit kommentanren, einrückungen und gutem stil - und dann sag mir, welchen du nach nem jahr noch verstehst.

Hängt davon ab wer den geschrieben hat.
Ich verwende immer sinnvolle variablen wenn ich was größeres code. Das mit dem eingerücktem hat FBIde drauf und außerdem werden natürlich die Befehle farblich markiert. Kommentare mache ich nicht sehr viele, höchstens ein paar Stichworte, aber durch die Namen der Subs z.B. finde ich mich in meinen Quellcodes immer wieder nach kurzer Zeit zurecht, ich mach mir immer die Schrift ganz klein damit ich alles übersichtlich sehen kann. AUßerdem benutze ich Leerzeilen zur einteilung der Programme und Gruppiere die Befehle in einer DO....LOOP Schleife die länger laufen soll(z.B. Grafikbefehle alle an einer Stelle). IF-Schleifen habe ich sehr oft ineienander verschachtelt, manchmal steht in drei Zeilen hinterienender 3 mal IF, aber schlimm finde ich das nicht. Und warum bitteschön sollte mir das jemand "eingetrichtert" haben??? Ich kann mir selber Meinungen bilden und entscheiden was Sinnvoll ist.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 13.01.2009, 22:35    Titel: Antworten mit Zitat

Klar kannst du dich entscheiden, was du für richtig empfindest - und dich dann später vielleicht drüber totärgern. Ich hätte stiltechnisch früher auch einiges anders machen sollen, und solche verschachtelungen (ist jetzt c++, aber egal) sind wirklich schon an der grenze des ertragbaren:


_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 13.01.2009, 22:55    Titel: Antworten mit Zitat

@frebas / @wers noch wissen will

ich könnte dir als Tip geben, wenn du ihn möchtest, bei verschachtelungen in schleifen lieber ein Goto zu nutzen, wenn du verschachtelte bedingunen hast, wie z.B. diese hier:
Code:

For X as UInteger = 1 to RC
   D = RD(X)
   XPos = InStr(1, D, "<a href=""")
   If XPos > 0 Then
      D = Mid(D, XPos + 9)
      XPos = InStr(1, D, """")
      If XPos > 0 Then
         T = Left(D, XPos - 1)
         XPos = InStr(1, T, "audio/")
         If XPos > 0 Then
            T = Mid(T, XPos + 6)
            XPos = InStr(1, T, "/")
            If XPos > 0 Then
               T = Left(T, XPos - 1)
               S = "<div class=""title"">"
               XPos = InStr(1, D, S)
               If XPos > 0 Then
                  Print "OK"
                  'bla
               End If
            End If
         End If
      End If
   End If
Next



Hier könnte man das einfach stackschonender machen. Dabei spart man auch ein paar zeilen. Nämlich die "End If" zeilen, was den source gleich kompackter macht:
Code:

For X as UInteger = 1 to RC
   D = RD(X)
   XPos = InStr(1, D, "<a href=""")
   If XPos = 0 Then Goto TS_INT_NextFile
   D = Mid(D, XPos + 9)
   XPos = InStr(1, D, """")
   If XPos = 0 Then Goto TS_INT_NextFile
   T = Left(D, XPos - 1)
   XPos = InStr(1, T, "audio/")
   If XPos = 0 Then Goto TS_INT_NextFile
   T = Mid(T, XPos + 6)
   XPos = InStr(1, T, "/")
   If XPos = 0 Then Goto TS_INT_NextFile
   T = Left(T, XPos - 1)
   S = "<div class=""title"">"
   XPos = InStr(1, D, S)
   If XPos = 0 Then Goto TS_INT_NextFile
   Print "OK"
   'bla
   TS_INT_NextFile:
Next



Dann könnte man das ganze auch noch grupieren, da viele dinge öffter vorkommen. Aber das is dann jetzt wohl ziemliche geschmacksfrage, und viele maben mich deswegen schon angemäckert :]
Code:

For X as UInteger = 1 to RC
   D = RD(X)
   XPos = InStr(1, D, "<a href="""):   If XPos = 0 Then Goto TS_INT_NextFile
   D = Mid(D, XPos + 9)
   XPos = InStr(1, D, """"):         If XPos = 0 Then Goto TS_INT_NextFile
   T = Left(D, XPos - 1)
   XPos = InStr(1, T, "audio/"):      If XPos = 0 Then Goto TS_INT_NextFile
   T = Mid(T, XPos + 6)
   XPos = InStr(1, T, "/"):         If XPos = 0 Then Goto TS_INT_NextFile
   T = Left(T, XPos - 1)
   S = "<div class=""title"">"
   XPos = InStr(1, D, S):            If XPos = 0 Then Goto TS_INT_NextFile
   Print "OK"
   'bla
   TS_INT_NextFile:
Next

Leider siehsts hier im code-tag nicht so schön übereinander geordnet aus.


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
The_Muh
aka Mark Aroni


Anmeldungsdatum: 11.09.2006
Beiträge: 718

BeitragVerfasst am: 13.01.2009, 23:02    Titel: Antworten mit Zitat

Offtopic: (wobei, sind wir da nich schon angelangt?)
Warnung, der nachfolgende Text enthält gefährliche Mengen Sarkasmus

Ich hab den Thread das erste mal angeguckt, als Nemored schon die antwort auf die Frage gepostet hat. Gedanke in dem Moment: "Hui, noch so ein Kurzlebiger Thread" ... und nun stell ich fest wie sich ein Haufen (hoffentlich) gebildeter Programmier über If streiten, und ob man besser Verschachtelt oder ORELSE benutzt, und ob methode 1 langsamer oder schneller ist als Methode 2 und was davon besser lesbar ist...

Ich Frage mich ob man solch Simple fragen verbieten sollte... demnächst, wenn jemand nach Print fragt, ensteht nen Flamewar über die nützlichkeit von Print, und ob man nicht lieber eine alternative benutzen sollte, die dann schnell von einem der Diskussionsteilnehmer gebastelt wird... nach mehreren Tagen endet dann die Diskussion schlagartig weil jemand gefragt hat wie Case funktioniert .... =/

Topic:
So viel wie möglich in eine If-Prüfung zu stecken umd verschachtelungen zu vermeiden halte ich für nicht grade klug.
Sowas kann - wenn man statt ner einfachen werte-prüfung mit befehls/funktions-verschachtelungen arbeitet - extrem lang werden... bei solchen gelegenheiten stapel ich die If-Prüfungen lieber... aber das hat jeder selbst zu verantworten, merkliche geschwindigkeitsunterschiede wird es wohl kaum geben. Solche Sachen sind einfach eine Frage des persönlichen Programmierstils und haben nichts mit Gut oder schlecht zu tun. Und mal ehrlich, wenn man seinen Code unter ne (F/L)OSS-Lizenz stellt, in der hoffnung jemand anderes guckt mal in den code und bastelt daran weiter, vergrault man die leute mit ellen langen If-Prüfungen, und wenn derjenige die verschachtelungen nicht mag, kann er sie wieder auseinander nehmen. Ich denke dazu ist letztenendes jeder in der lage (notfalls mit Probieren).
_________________
// nicht mehr aktiv //
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4699
Wohnort: ~/

BeitragVerfasst am: 13.01.2009, 23:12    Titel: Antworten mit Zitat

@Offtopic: Von Flamewar sehe ich hier noch nichts. Aber als Alternative zu PRINT empfehle ich (in bestimmten Fällen) DRAW STRING. grinsen

Ansonsten dreht sich der Thread aber durchaus noch um das eigentliche Thema, nämlich die Frage, ob ein bestimmter Programmteil ausgeführt wird - vermutlich mit dem Hintergrund, eben diese Ausführung zu vermeiden. Darüber darf man dann schon mal diskutieren. lächeln


Nachtrag, zu der GOTO-Variante: Wenn nach dem TS_INT_NextFile: nichts mehr kommt (außer NEXT) dann würde ich hier eher ein CONTINUE FOR einsetzen.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 13.01.2009, 23:29    Titel: Antworten mit Zitat

@nemored jo .. das wär sicher angebrachter ..

ich hab das jetzt grad mal fix getestet,udnmuss sagen, das ich erstaunt bin .. ich wär felsenfest davon ausgegangen, das das goto flotter is als mehrere if schachtelungen
http://www.freebasic-portal.de/index.php?s=fbporticula&mode=show&id=782

gut .. ich nutze das goto auch nur dann, wenn ich mehr als 2 schleifen ineinander hab, und aus beiden inneren raus muss .. da is das (hoffe ich mal) flotter.

aber is schon interessant, wie man aus einem einfachen topic solche erkenntnisse gewinnen kann grinsen


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz