Autor | Thema |
---|---|
manfredkraft
Anzündhilfe Registriert seit: Jul 2005 Wohnort: Verein: Beiträge: 45 Status: Offline |
Beitrag 107845
, Bascom IF-Then_else-Problem
[16. November 2006 um 00:21]
Hallo Bascom - Spezialisten,
kann mir jemand erklären, warum die in dem beigefügten Bascom-Test die IF-THEN-ELSE-endif Tests alle Compiler-Fehler verursachen? Bin für jeden Hinweis Dankbar, da selbst kein Basic-Programmierer! mfg Manfred Anhang: if_test.zip |
Reinhard
Überflieger Registriert seit: Sep 2003 Wohnort: Österreich Verein: TRA #10691, AGM Beiträge: 1187 Status: Offline |
Beitrag 107846
[16. November 2006 um 00:48]
Hi,
ich bin auch kein Basic Programmier, also kann ich nur spekulieren. In Teil 10 des Kurses erwähnt Pierre keine "END IF" Anweisung. Ich kenne die eigentlich nur als Präprozessoranweisung von C/C++-Compilern. Gruß Reinhard |
CharlyMai
Foren-Prediger
Registriert seit: Mär 2005 Wohnort: Fuhrberg Verein: SOLARIS-RMB e.V. (P2;T2) / AGM / TRA#21598 Beiträge: 1977 Status: Offline |
Beitrag 107847
[16. November 2006 um 01:31]
ich kümmer mich da nachher (nach der Arbeit *fg*) mal drum....
nur soviel am Rande (habe es mal ebend überflogen).. eine mehrfache If-Then verzweigung geht nie gut!!! ----> Hint: Es gibt da noch Case Select *fg* .... wenn Du vorarbeiten willst schau in die Hilfe Sonst gedulde dich bis heute Abend, und ich poste hier die Zip mit den erklärten einzelnen Fällen und der Fehlerbeseitigung... viele Grüße Pierre, der mittlerweile schon die Nacht mit zum Arbeiten nimmt, weil der tag nicht ausreicht •"Der Glaube an eine bestimmte Idee gibt dem Forscher den Rückhalt für seine Arbeit. Ohne diesen Glauben wäre er verloren in einem Meer von Zweifeln und halbgültigen Beweisen." Konrad Zuse •Konstruiere ein System, das selbst ein Irrer anwenden kann, und so wird es auch nur ein Irrer anwenden wollen. SOLARIS-RMB e.V. AGM |
manfredkraft
Anzündhilfe Registriert seit: Jul 2005 Wohnort: Verein: Beiträge: 45 Status: Offline |
Beitrag 107848
, IF-THEN-ELSE-ENIF
[16. November 2006 um 08:06]
HAllo und Guten Morgen!
die LCD-Ausgabe ist nunmehr programmiert und als Routine einsetzbar. Ich will nun die einzelnen unabhängigen Funktionen wie LCD-Ausgabe, Tonerzeugung, Tastatur, etc. wg der zeitlichen Einschränkungen als Tasks realisieren; jede Task hat einen Status, der von einer Timer0-Interrupt Routine (Scheduler) in einem festen Zeitraster abgefragt wird. Hier ist der Status zunächst ein einfaches Flag, das anzeigt, ob die zugehörige Task aufgerufen werden soll. ( z. B. IF LCD_READY = 1 THEN Starte_LCD ... ) (Der Status soll später auch eine Prioritäten-Steuerung einbeziehen) mfg manfred |
Gelöscht2
Epoxy-Meister Registriert seit: Aug 2005 Wohnort: Verein: Beiträge: 213 Status: Offline |
Beitrag 107849
[16. November 2006 um 10:01]
*gelöscht gem. BDSG*
|
Neil
99.9% harmless nerd
Registriert seit: Aug 2000 Wohnort: Delft Verein: SOLARIS Beiträge: 7776 Status: Offline |
Beitrag 107852
[16. November 2006 um 11:16]
Hi,
ich habe auch schon etwas mit IF THEN Anweisung gespielt in BASCOM Wenn du sowas wie eine CASE Anweisung machen willst, wo du also eine Variable mit verschiedenen Werten vergleichst um dann entsprechend zu handeln, würde sich sowas auch anbieten: If wert=1 THEN GoSub was_tun_bei_1 If wert=2 THEN GoSub was tun_bei_2 If wert=3 THEN GoSub was_tun_bei_3 If wert=4 THEN GoSub was tun_bei_4 If wert=5 THEN GoSub was_tun_bei_5 If wert=6 THEN GoSub was tun_bei_6 If wert=7 THEN GoSub was_tun_bei_7 If wert=8 THEN GoSub was tun_bei_8 Der Vorteil gegenüber ENDIF ist die Struktur der Abfrage. Du hast da nur die Sprunganweisungen stehen und keinen weiteren Code der das unübersichtlich machen würde. Eine Case Anweisung dürfte aber auch vom Prozessoraufwand her weniger Aufwand sein. Es kostet weniger Zeit und Speicher, was dann optimierter ist. Gruß Neil Die Erde ist eine Scheibe. Egal in welche Richtung sich die Menschheit bewegt, sie geht immer auf einen Abgrund zu. |
AlexanderM
Epoxy-Meister Registriert seit: Feb 2004 Wohnort: Düsseldorf Verein: FAR Beiträge: 238 Status: Offline |
Beitrag 107864
[16. November 2006 um 15:55]
Hallo Neil,
ich habe im BASCOM mit der If-Then Anweisung etwas "gespielt" und folgendes herausgefunden: - Wenn die Anweisung komplett in einer Zeile steht und dabei kein ElseIf oder Else verwendet wird, darf kein End If verwendet werden. - Werden Else oder ElseIf verwendet, muß ein End If am Schluß gesetzt werden und die Tasks müssen in einer eigenen Zeile stehen. Das ist sicher eine etwas gewöhnungsbedürftige Syntax und vor allem in der (ohnehin mäßigen) BASCOM-Hilfe auch nicht explizit erklärt. Aber Basic ist ja auch dafür bekannt, nicht besonders konsequent zu sein. Bei C gibt es ja das Semikolon, mit dem jede Anweisung abgeschlossen werden muß. Das ist am Anfang sicher auch gewöhnungsbedürftig, aber letztendlich erleichtert es dann das Leben. Ein Tip noch: Bei so einem langen Listing zuerst einmal alles auskommentieren bis auf die erste Anweisung. Dann Syntax-Check und den Fehler analysieren. Wenn der behoben ist, die nächste Zeile wieder "einkommentieren", usw. Lässt man nämlich alles auf einmal durch den Compiler nudeln, gibt's oftmals schwer zu interpretierende Folgefehler. Hier das kommentierte Listing: Dim T As Byte Dim Flaga1 As Bit Dim Flaga2 As Bit Dim Flaga3 As Bit '* Fall.1 If T = 1 Then Flaga1 = 1 If T = 2 Then Flaga2 = 1 If T = 3 Then Flaga3 = 1 : T = 0 'End If darf hier NICHT stehen, da die If-Anweisungen 'jeweils in einer Zeile stehen '* Fall.2 'Wenn man Elseif verwendet, muß die Task nach dem Then in 'einer neuen Zeile stehen. Das gleiche gilt für die Else-Anweisung If T = 1 Then Flaga1 = 1 Elseif T = 2 Then Flaga2 = 1 Elseif T = 3 Then Flaga3 = 1 : T = 0 Else Flaga3 = 0 End If '* Fall.3 If T = 1 Then Flaga1 = 1 If T = 2 Then Flaga2 = 1 If T = 3 Then Flaga3 = 1 : T = 0 'End If darf hier nicht stehen (s.o.) '* Fall.4 If T = 1 Then Flaga1 = 1 'End If If T = 2 Then Flaga2 = 1 'End If If T = 3 Then Flaga3 = 1 : T = 0 'End If 'die End If dürfen hier nicht stehen, da die komplette 'If-Anweisung in nur einer Zeile steht. '* Fall.5 If T = 1 Then Flaga1 = 1 If T = 2 Then Flaga2 = 1 If T = 3 Then Flaga3 = 1 : T = 0 'End If darf hier nicht stehen (s.o.) End 'end program CU, Alexander |
manfredkraft
Anzündhilfe Registriert seit: Jul 2005 Wohnort: Verein: Beiträge: 45 Status: Offline |
Beitrag 107869
, IF-THEN-ELSE
[16. November 2006 um 17:23]
HAllo,
Danke für die ausführichen Kommentare Grüsse Manfred |
CharlyMai
Foren-Prediger
Registriert seit: Mär 2005 Wohnort: Fuhrberg Verein: SOLARIS-RMB e.V. (P2;T2) / AGM / TRA#21598 Beiträge: 1977 Status: Offline |
Beitrag 107880
[16. November 2006 um 20:15]
Tja, was soll ich nun noch sagen ...
Suuper, dass hier doch nun mal wieder eine Diskussion stattfindet, und ihr euch gegenseitig helft .-) Ich kann nur sagen ... Joa ... so ist es ... aber es gibt auch noch Case Select *zwinker* Am WE werde ich dann mal den Teil für das LCD mit den High-Level Befehlen fertigstellen. viele Grüße Pierre •"Der Glaube an eine bestimmte Idee gibt dem Forscher den Rückhalt für seine Arbeit. Ohne diesen Glauben wäre er verloren in einem Meer von Zweifeln und halbgültigen Beweisen." Konrad Zuse •Konstruiere ein System, das selbst ein Irrer anwenden kann, und so wird es auch nur ein Irrer anwenden wollen. SOLARIS-RMB e.V. AGM |
manfredkraft
Anzündhilfe Registriert seit: Jul 2005 Wohnort: Verein: Beiträge: 45 Status: Offline |
Beitrag 107895
[17. November 2006 um 07:56]
Hallo,
habe nun getestet und den Scheduler jeweils mit IF und CAse realisiert. Die Lösung mit case hatte ca. 8 % mehr maschinencode (1056 vs 978 Byte) Nachtrag zu Compiler-Verhalten: Folgender Code wurde vom Compiler akzeptiert und führte im Simulator zu Laufzeitfehler: '**************************************************************** Case 5 : Case 6 : '<------------- kein Compilerfehler, Führte zu Laufzeitfehler Case 7 : Task3: nop '------------------------------------------------------------------------------- stattdessen ist : '------------------------------------------------------------------------------- Case 4 To 7: nop '------------------------------------------------------------------------------- ok mfg manfred |