 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Type
Anmeldungsdatum: 24.02.2006 Beiträge: 187 Wohnort: Dresden
|
Verfasst am: 13.01.2009, 15:54 Titel: Kleine Verständnisfrage in Bezug auf IF-Funktion |
|
|
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 |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4699 Wohnort: ~/
|
Verfasst am: 13.01.2009, 16:07 Titel: |
|
|
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 |
|
 |
Type
Anmeldungsdatum: 24.02.2006 Beiträge: 187 Wohnort: Dresden
|
Verfasst am: 13.01.2009, 17:16 Titel: |
|
|
Alles klar, danke für die Info  |
|
Nach oben |
|
 |
frebas
Anmeldungsdatum: 20.06.2008 Beiträge: 245
|
Verfasst am: 13.01.2009, 17:33 Titel: |
|
|
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 |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 13.01.2009, 17:40 Titel: |
|
|
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 |
|
 |
frebas
Anmeldungsdatum: 20.06.2008 Beiträge: 245
|
Verfasst am: 13.01.2009, 17:58 Titel: |
|
|
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 |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 13.01.2009, 18:01 Titel: |
|
|
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 |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 13.01.2009, 18:18 Titel: |
|
|
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 |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 13.01.2009, 19:09 Titel: |
|
|
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 |
|
 |
Type
Anmeldungsdatum: 24.02.2006 Beiträge: 187 Wohnort: Dresden
|
Verfasst am: 13.01.2009, 19:52 Titel: |
|
|
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 |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4699 Wohnort: ~/
|
Verfasst am: 13.01.2009, 20:10 Titel: |
|
|
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 |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 13.01.2009, 20:10 Titel: |
|
|
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 |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 13.01.2009, 20:45 Titel: |
|
|
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 |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4699 Wohnort: ~/
|
Verfasst am: 13.01.2009, 20:58 Titel: |
|
|
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 |
|
 |
frebas
Anmeldungsdatum: 20.06.2008 Beiträge: 245
|
Verfasst am: 13.01.2009, 21:48 Titel: |
|
|
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 |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 13.01.2009, 22:35 Titel: |
|
|
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 |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 13.01.2009, 22:55 Titel: |
|
|
@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 |
|
 |
The_Muh aka Mark Aroni

Anmeldungsdatum: 11.09.2006 Beiträge: 718
|
Verfasst am: 13.01.2009, 23:02 Titel: |
|
|
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 |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4699 Wohnort: ~/
|
Verfasst am: 13.01.2009, 23:12 Titel: |
|
|
@Offtopic: Von Flamewar sehe ich hier noch nichts. Aber als Alternative zu PRINT empfehle ich (in bestimmten Fällen) DRAW STRING.
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.
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 |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 13.01.2009, 23:29 Titel: |
|
|
@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
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
|
|
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.
|
|