Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
timS
Anmeldungsdatum: 15.05.2008 Beiträge: 7
|
Verfasst am: 15.05.2008, 01:15 Titel: Fehlermeldung |
|
|
Hallo,
Ich musste mich für ein Schulprojekt die letzten Tage mit QuickBasic beschäftigen. Das Programm klappt und steuert das Auto über ein Relaisinterface wie es soll.
Nun möchte wollte ich eine .exe- Datei kompilieren, und da tritt mein Fehler auf:http://img88.imageshack.us/my.php?image=fehlerpe3.png
Der Code ist folgender:
Code: | CLS
start:
PRINT "--*Pfeiltasten benutzen*--"
PRINT "VORWŽRTS => HOCH"
PRINT "RšCKWŽRTS => RUNTER"
PRINT "BEENDEN => LEERTASTE"
VIEW PRINT 5 TO 25
COLOR 0, 7: CLS
SLEEP
druck% = INP(&H60)
SELECT CASE druck%
CASE 72
DO
a$ = INKEY$
druck% = INP(&H60)
IF druck% = 72 THEN
OUT 888, 3
ELSE
OUT 888, 0
GOTO start
END IF
LOOP UNTIL druck% <> 72
CASE 80
DO
a$ = INKEY$
druck% = INP(&H60)
IF druck% = 80 THEN
OUT 888, 0
ELSE
OUT 888, 0
GOTO start
END IF
LOOP UNTIL druck% <> 80
CASE 57
COLOR 4, 14
PRINT "PROGRAMM BEENDET"
END
CASE ELSE
PRINT "FALSCHE EINGABE"
GOTO start
END SELECT |
Ich hoffe ihr könnt mir schnellstmöglich helfen.
MfG timS |
|
Nach oben |
|
|
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 15.05.2008, 09:13 Titel: |
|
|
Vermutlich liegt Deine Quellcode-Datei in einem anderen Pfad als der Compiler. Es gibt drei Möglichkeiten:
1) Du gibst beim Compilieren den vollen Pfad der Bas-Datei an oder verschiebst sie in den Ordner, wo der Compiler liegt.
2) Wenn Du mit QuickBasic arbeitest, hast Du den Editor dabei. Aus dem heraus kannst Du auch compilieren.
3) Wenn Du mit einem anderen Texteditor arbeitest, kannst Du in Windows oder der DOSshell die Quellcode-Datei mit der Maus direkt auf den Kommandozeilenkompiler ziehen. Der arbeitet dann von selbst weiter. _________________ Und die Grundgebihr is aa scho drin- DOS is jo nett. |
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2511 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 15.05.2008, 09:14 Titel: |
|
|
Ich würde als erstes einmal Umlaute in Dateinamen vermeiden. Benenn doch Dein Programm lieber als
Ansonsten beinhaltet der Code wieder einmal einiges an Verbesserungsmöglichkeiten: GOTO sollte vermieden werden und kann in diesem Fall problemlos eliminiert werden: Wie wäre es mit einer grossen DO-LOOP-Schleife um das Ganze herum, die ein Leertastendruck als Abbruchbedingung besitzt? Siehe auch
http://www.dreael.ch/Deutsch/BASIC-Knowhow-Ecke/Anfaengerfehler.html
als Sammlung typischer derartiger Fehler. Ansonsten noch etwas Unlogisches gefunden:
timS hat Folgendes geschrieben: | Code: | IF druck% = 80 THEN
OUT 888, 0
ELSE
OUT 888, 0 |
|
d.h. macht wohl nicht sehr viel Sinn. Ich nehme an, das eine müsste ein von 0 abweichender OUT-Wert sein. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
|
timS
Anmeldungsdatum: 15.05.2008 Beiträge: 7
|
Verfasst am: 15.05.2008, 11:24 Titel: |
|
|
Danke ihr beiden, es hat einfach am Dateinamen gelegen. Darauf wäre ich nie gekommen^^.
@dreael
Code: | IF druck% = 80 THEN
OUT 888, 12
ELSE
OUT 888, 0 |
Hatte mich da einfach verschrieben. Das mit der Schleife werde ich auch befolgen.
Zuletzt bearbeitet von timS am 15.05.2008, 21:49, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2511 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 15.05.2008, 20:24 Titel: |
|
|
Habe inzwischen eine stark verbesserte Version zusammengestellt:
http://beilagen.dreael.ch/QB/FUEK_2.BAS
Kommt ohne GOTO aus und zeigt Dir ausserdem noch auf, wie die Sache mit dem Drücken und Loslassen bei INP(&H60) korrekt funktioniert.
Mein Beispiel liesse sich übrigens noch soweit ausbauen, dass man 8 Tasten (Scancode) gleichzeitig auswerten könnte und hierbei jeder Taste ein korrespondierendes Bit (Pin) am Parallelport zuweist, um Muster generieren zu können. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
|
timS
Anmeldungsdatum: 15.05.2008 Beiträge: 7
|
Verfasst am: 15.05.2008, 21:48 Titel: |
|
|
Vielen Dank für die Mühe. Ich werde das Programm morgen mal mit dem Auto ausprobieren und dann hier posten wies geklappt hat und was ich vllt nicht so ganz verstehe.
MfG timS |
|
Nach oben |
|
|
timS
Anmeldungsdatum: 15.05.2008 Beiträge: 7
|
Verfasst am: 16.05.2008, 22:49 Titel: |
|
|
Das Programm Funktioniert super, es gefällt mir besser als meins Nun fehlt mir aber leider etwas das verständnis. Ich zitiere mal die Stellen, die ich nicht ganz verstehe:
' Bit 7 ist immer, ob heruntergedrckt oder losgelassen
' Bits 6-0 sind Scancode der jeweiligen Taste
WHILE drin%...WEND
1. Ich verstehe die Bedingung nicht.
2. Warum keine DO...LOOP- Schleife?
(Bin übrigens von Samstag bis Samstag im Urlaub.) |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4615 Wohnort: ~/
|
Verfasst am: 16.05.2008, 22:55 Titel: |
|
|
Mit WHILE...WEND wird vor dem ersten Durchlauf getestet, ob die Bedingung erfüllt ist - evtl. wird die Schleife gar nicht durchlaufen. Mit DO...LOOP UNTIL wird erst nach dem ersten Durchlauf überprüft, d. h. es findet auf jeden Fall mindestens ein Durchlauf statt. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2511 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 17.05.2008, 16:29 Titel: |
|
|
timS hat Folgendes geschrieben: | WHILE drin%...WEND
1. Ich verstehe die Bedingung nicht. |
In Pascal und Modula-2 wäre drin% vom Typ BOOLEAN. Leider bietet QB diesen Datentyp nicht an (VBScript dagegen hat ihn, FreeBasic fehlt dieser Datentyp auch immer noch). QB (und auch FreeBasic) aber stellen Boolsche Werte durch eine (Integer-)Zahl dar mit Wert <> 0, bevorzugt -1 = TRUE, 0 = FALSE.
Von daher kommt es, dass in vielen Codes ein Ausdruck
Code: | IF Ausdruck <> 0 THEN |
zu
verkürzt wird. In C/C++ übrigens analog. Für Dich zum Testen: Probiere einmal
Code: | PRINT 6 > 4
PRINT 3 <> 3 |
im Direktmodus aus.
timS hat Folgendes geschrieben: | 2. Warum keine DO...LOOP- Schleife? |
WHILE/WEND ist übrigens 100% gleichwertig zu DO WHILE/LOOP, nur andere Syntax (gab es bereits in GW-BASIC).
/edit: Inzwischen auch mein Beispiel ausgebaut:
http://beilagen.dreael.ch/QB/FUEK_3.BAS
Zum einen Beendung mit <Esc> anstelle von Leertaste, zum anderen 8 Tasten ausgesucht, bei welcher jede einem Datenpin vom Parallelport entspricht, womit Du bis zu 8 verschiedene Relais oder weiss ich was ansteuern kannst.
Wichtig: Mehrere Tasten können auch gleichzeitig gedrückt werden, dementsprechend bekommen auch mehrere Pins am Parallelport die berühmten +5 Volt anliegend. Dieses Verhalten besitzt übrigens bereits FUEK_2.BAS.
Für andere Tasten einfach die beiden DATA-Zeilen entsprechend anpassen (Scancode und Textsymbol). z.B. Dein Auto könntest Du auf D0 das Vorwärts nehmen und auf D1 das Rückwärts bei Deiner Hardware nehmen.
@alle übrigen: Damit steht Euch ein ganz einfacher Tastatur-Bitmustergenerator für das Testen von Parallelportschaltungen zur Verfügung. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
|
timS
Anmeldungsdatum: 15.05.2008 Beiträge: 7
|
|
Nach oben |
|
|
timS
Anmeldungsdatum: 15.05.2008 Beiträge: 7
|
Verfasst am: 09.06.2008, 00:14 Titel: |
|
|
Wo ist denn der sinn in dieser Zeile?
MfG |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4615 Wohnort: ~/
|
Verfasst am: 09.06.2008, 06:59 Titel: |
|
|
Die Zeile liest ein Zeichen von der Tastatur aus, vermutlich, um den Tastaturbuffer zu leeren. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2511 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 09.06.2008, 09:12 Titel: |
|
|
timS hat Folgendes geschrieben: | Wo ist denn der sinn in dieser Zeile?
MfG |
Ist eigentlich von Dir selber etwas! Zitat:
timS hat Folgendes geschrieben: | Code: |
a$ = INKEY$
druck% = INP(&H60) |
|
d.h. Du gebrauchst hier a$ ebenfalls als Dummy-Variable, weil Du ja mit a$ nirgends mehr etwas machst.
Allerdings konnte ich tatsächlich einen sinnvollen Grund fürs Puffer leeren entdecken: INP(&H60)-basierte Tastaturabfragen laufen gerne manchmal etwas hakelig, wenn man das BIOS und DOS nicht mit solchen INKEY$-Abfragen "entlastet" (stellte ich seinerzeit beim JUMPGAME-Beispiel fest). => Von daher hast Du mir sogar unbemerkt einen kleinen Verbesserungsvorschlag mit Deinem ursprünglichen Beispiel geliert. Ich habe dann lediglich den Namen dummy$ statt a$ genommen, damit die Eigenschaft, dass nichts mehr mit dieser Variable weiterverarbeitet wird, besser zur Geltung kommt.
Und damit will ich auch eine Antwort zu diesem Thread geben, weil es thematisch wieder einmal eng zusammenhängt: Bei vielen anderen Programmiersprachen sind derartige Dummy-Variablen gar nicht nötig, da eine Funktion wie eine Anweisung aufgerufen werden kann! _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
|
timS
Anmeldungsdatum: 15.05.2008 Beiträge: 7
|
Verfasst am: 09.06.2008, 15:45 Titel: |
|
|
Ah, genau ;D
Das war zum leeren des Tastenpuffers, damit der PC nicht anfängt zu piepen
(Was bei Pfeiltasten ja nicht der Fall ist). Danke
MfG |
|
Nach oben |
|
|
|