Du kannst keine neue Antwort schreiben
Seiten (3): [1] 2 3 »

Autor Thema 
manfredkraft

Anzündhilfe

Registriert seit: Jul 2005

Wohnort:

Verein:

Beiträge: 45

Status: Offline

Beitrag 107845 , Bascom IF-Then_else-Problem [Alter Beitrag16. November 2006 um 00:21]

[Melden] Profil von manfredkraft anzeigen    manfredkraft eine private Nachricht schicken   Besuche manfredkraft's Homepage    Mehr Beiträge von manfredkraft finden

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

Reinhard

Registriert seit: Sep 2003

Wohnort: Österreich

Verein: TRA #10691, AGM

Beiträge: 1186

Status: Offline

Beitrag 107846 [Alter Beitrag16. November 2006 um 00:48]

[Melden] Profil von Reinhard anzeigen    Reinhard eine private Nachricht schicken   Besuche Reinhard's Homepage    Mehr Beiträge von Reinhard finden

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


Administrator

CharlyMai

Registriert seit: Mär 2005

Wohnort: Fuhrberg

Verein: SOLARIS-RMB e.V. (P2;T2) / AGM / TRA#21598

Beiträge: 1976

Status: Offline

Beitrag 107847 [Alter Beitrag16. November 2006 um 01:31]

[Melden] Profil von CharlyMai anzeigen    CharlyMai eine private Nachricht schicken   Besuche CharlyMai's Homepage    Mehr Beiträge von CharlyMai finden

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 [Alter Beitrag16. November 2006 um 08:06]

[Melden] Profil von manfredkraft anzeigen    manfredkraft eine private Nachricht schicken   Besuche manfredkraft's Homepage    Mehr Beiträge von manfredkraft finden

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 [Alter Beitrag16. November 2006 um 10:01]

[Melden] Profil von Gelöscht2 anzeigen    Gelöscht2 eine private Nachricht schicken   Gelöscht2 besitzt keine Homepage    Mehr Beiträge von Gelöscht2 finden

*gelöscht gem. BDSG*
Neil

99.9% harmless nerd


Administrator

Neil

Registriert seit: Aug 2000

Wohnort: Delft

Verein: SOLARIS

Beiträge: 7776

Status: Offline

Beitrag 107852 [Alter Beitrag16. November 2006 um 11:16]

[Melden] Profil von Neil anzeigen    Neil eine private Nachricht schicken   Neil besitzt keine Homepage    Mehr Beiträge von Neil finden

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 [Alter Beitrag16. November 2006 um 15:55]

[Melden] Profil von AlexanderM anzeigen    AlexanderM eine private Nachricht schicken   Besuche AlexanderM's Homepage    Mehr Beiträge von AlexanderM finden

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. wink
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 [Alter Beitrag16. November 2006 um 17:23]

[Melden] Profil von manfredkraft anzeigen    manfredkraft eine private Nachricht schicken   Besuche manfredkraft's Homepage    Mehr Beiträge von manfredkraft finden

HAllo,

Danke für die ausführichen Kommentare

Grüsse
Manfred

stick out tongue
CharlyMai

Foren-Prediger


Administrator

CharlyMai

Registriert seit: Mär 2005

Wohnort: Fuhrberg

Verein: SOLARIS-RMB e.V. (P2;T2) / AGM / TRA#21598

Beiträge: 1976

Status: Offline

Beitrag 107880 [Alter Beitrag16. November 2006 um 20:15]

[Melden] Profil von CharlyMai anzeigen    CharlyMai eine private Nachricht schicken   Besuche CharlyMai's Homepage    Mehr Beiträge von CharlyMai finden

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 [Alter Beitrag17. November 2006 um 07:56]

[Melden] Profil von manfredkraft anzeigen    manfredkraft eine private Nachricht schicken   Besuche manfredkraft's Homepage    Mehr Beiträge von manfredkraft finden

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
Seiten (3): [1] 2 3 »
[Zurück zum Anfang]
Du kannst keine neue Antwort schreiben