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:

Zeilen löschen und allgemeine Fragen

 
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
AQUA-MAN



Anmeldungsdatum: 26.03.2009
Beiträge: 15

BeitragVerfasst am: 27.03.2009, 11:21    Titel: Zeilen löschen und allgemeine Fragen Antworten mit Zitat

Hallöchen

Das folgende spielt sich in einem Konsolenfenster ab, also alles nur Text.
Ich programmiere ein kleines Zahlenrate-Spiel und bin grade dabei das der User die niedrigste und höchste Zahl in dem die zu ratende Zahl liegen soll eingibt. Falls der Unterschied dabei weniger als 50 beträgt soll eine kurze Fehlermeldung ausgegeben werden und das ganze von vorne beginnen mit der Eingabe der Zahlen.
Mein Problem besteht dadrin das ich gerne die angezeigten Zeilen + Eingabe löschen würde ohne den gesamten Bildschirminhalt zu löschen. Ich habe es zwar hinbekommen aber die Lösung gefällt mir überhaupt nicht. Hier ist der Code:
Code:
DO
  IF Temp = "JA" THEN
    LOCATE 10,3: PRINT "Tut mir leid, aber zwischen den Zahlen sollte ein Unterschied von 50 sein."
    GETKEY
    LOCATE 6,3: PRINT "                                             "
    LOCATE 7,3: PRINT "                                "
    LOCATE 10,3: PRINT "                                                                          "
    LOCATE 6,1
  ENDIF
  PRINT TAB(3); "Was soll die niedrigste Zahl sein? ";
  NZahl = VAL(EINGABE(4, 9)): PRINT
  PRINT TAB(3); !"Und die h\148chste Zahl? ";
  HZahl = VAL(EINGABE(4, 9))
  Temp = "JA"
LOOP UNTIL HZahl-NZahl > 50 AND HZahl > NZahl

Wie man sehen kann ist mir nur die Lösung eingefallen das ich die Zeilen + Mögliche Länge der Antwort überschreibe mit Leerzeichen.
Ich habe auch an den äußersten Zeilen und Spalten einen kleinen Rahmen gemacht, deswegen kann ich nicht die ganze Zeile Löschen ohne auch den Rahmen zu zerstören.
Die Syntax für Eingabe, mein Ersatz für INPUT, ist "Eingabe(Flag was erlaubt ist in der Antwort (4 z.B. steht für Zahlen), Maximal mögliche Länge)". In diesem Beispiel ist die Länge auf 9 Zahlen beschränkt, weil die Variablen nur als UInteger deklariert sind und 1 Millarde Möglichkeiten sollten wohl genug sein. zwinkern
Ich weiß in Zeile 6 müßte ich nicht unbedingt die ganze Zeile löschen, aber jetzt ist es eben grade so.
Ich hatte schon gedacht das ich einen SCOPE-Block mache in dem ich eine Konstante Stringvariable die 9 x CHR(32) (Leertaste) enthält und danach 9 x CHR(8 ) (Backspace), natürlich alles in einer einzigen CHR()-Anweisung, aber ehrlich gesagt ist das auch bescheuert und würde auch mein Problem mit der Fehlermeldung nicht lösen. missbilligen
Gibt es eine andere Möglichkeit?
Und falls euch noch andere Verbesserungsmöglichkeiten auffallen die nicht zum Problem gehören wäre ich auch dankbar mich darauf hinzuweisen, bin noch ziemlich am Anfang was das Lernen angeht.


Zuletzt bearbeitet von AQUA-MAN am 28.03.2009, 15:23, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name
Nitroxis



Anmeldungsdatum: 27.02.2008
Beiträge: 300
Wohnort: Irgendwo...

BeitragVerfasst am: 27.03.2009, 23:21    Titel: Antworten mit Zitat

Um nicht immer soviele Leerzeichen schreiben zu müssen kannst du die STRING-Funktion bzw. die SPACE-Funktion benutzen
Code:
LOCATE 6,3: PRINT STRING(20, 32)
LOCATE 7,3: PRINT STRING(20, 32)
LOCATE 10,3: PRINT STRING(20, 32)
Du musst halt nur die richtige Anzahl an Leerzeichen verwenden.

Du kannst dieses If Temp = "JA" weglassen indem du es so machst:
Code:
DO
  PRINT TAB(3); "Was soll die niedrigste Zahl sein? ";
  NZahl = VAL(EINGABE(4, 9)): PRINT
  PRINT TAB(3); !"Und die h\148chste Zahl? ";
  HZahl = VAL(EINGABE(4, 9))
  IF HZahl-NZahl > 50 AND HZahl > NZahl THEN EXIT DO
  LOCATE 10,3: PRINT "Tut mir leid, aber zwischen den Zahlen sollte ein Unterschied von 50 sein."
  GETKEY
  LOCATE 6,3: PRINT STRING(20, 32) ' Hier natürlich
  LOCATE 7,3: PRINT STRING(20, 32) ' die richtige Anzahl
  LOCATE 10,3: PRINT STRING(20, 32) ' einsetzen!!!
  LOCATE 6,1
LOOP
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
AQUA-MAN



Anmeldungsdatum: 26.03.2009
Beiträge: 15

BeitragVerfasst am: 28.03.2009, 01:24    Titel: Antworten mit Zitat

Ja, stimmt ja "EXIT DO", da benutze ich CONTINUE DO und EXIT DO in meinem Ersatz für INPUT mehrmals und komm nicht auf die Idee es auch hier zu benutzen. mit dem Kopf durch die Mauer wollen Danke für den Hinweis.
Hm, ich weiß nicht warum aber ich war der festen Überzeugung das Space(n) den Cursor nur n Zeichen weitersetzt, zwischendrin aber nichts überschreibt, ähnlich wie TAB(n) nur dass sich das ja auf den Anfang der Zeile bezieht.
Hab es jetzt umgeändert:
Code:
  DO
    LOCATE 6,1
    PRINT TAB(3); "Was soll die niedrigste Zahl sein? ";
    NZahl = VAL(EINGABE(4, 9)): PRINT
    PRINT TAB(3); !"Und die h\148chste Zahl? ";
    HZahl = VAL(EINGABE(4, 9))
    IF HZahl-NZahl > 49 AND HZahl > NZahl THEN
      EXIT DO
    ELSE
      LOCATE 10,3: PRINT "Tut mir leid, aber zwischen den Zahlen sollte ein Unterschied von 50 sein."
      GETKEY
      LOCATE 6,3: PRINT TAB(35); "         "
      LOCATE 7,3: PRINT SPACE(32)
      LOCATE 10,3: PRINT SPACE(74)
    ENDIF
  LOOP

Problem gelöst. Danke.

Falls niemandem mehr was am Code auffällt, hätte ich noch eine Frage: Warum sagt (bisher) jeder das man GOTOs niemals benutzen sollte bzw. warum behaupten viele Leute sobald sie ein GOTO im Quell-Code sehen das es Spaghetticode ist?
Was ist so schlimm daran, ich habe die früher schon benutzt und ich tue es auch heute noch, nicht übermäßig, in dem Zahlenrate-Spiel bisher nur eines um an den Anfang des Spiels zurückzukehren falls der User gerne nochmal spielen möchte. Klar könnte ich das auch in eine riesige Schleife packen, aber ich sehe den Sinn darin nicht.
Und diese Beispiele die oft gezeigt werden (siehe 1. oder 3. Beispiel auf der verlinkten Seite unten), sind meiner Meinung nach bloß an den Haaren herbeigezogen, ok sie sollen das ganze nur veranschaulichen, aber trotzdem sowas habe ich noch nie auch nur Ansatzweise gemacht bzw. programmiert, ich persönlich habe schon versucht meine Programme einigermaßen Linear zu programmieren.
Dabei habe ich Basic auf einem C64 gelernt, ich müsste dann doch eigentlich anfälliger sein weil es dort z.B. keine DO..LOOP-Schleifen gab.
Vielleicht kann mir ja jemand hier im Forum mal verklickern warum so gut wie alle dabei so überreagieren?
Und dann eventuell welcher große Unterschied zwischen GOSUB und SUB sein soll, der es rechtfertigt GOSUB für verboten zu erklären (außer das "GOSUB wie GOTO ist" mit den Augen rollen ) aber SUB nicht. OK SUBs werden automatisch übersprungen wenn das Programm im normalen Ablauf auf eine solche stößt, GOSUBs nicht, die werden dann auch ausgeführt was meistens nicht so vorgesehen ist.
Ja, ich weiß das SUBs und GOSUBs nicht direkt miteinander verglichen werden können, das es sie nicht gleichzeitig in FreeBasic gibt, sondern nur in verschiedenen Compiler-Dialekten.
Hauptsächlich beziehe ich mich hier grade auf http://de.wikibooks.org/wiki/FreeBasic:_GOTO
Das beschäftigt mich schon seit Jahren und es regt mich immer wieder auf wenn ich sowas lese oder höre. Aber da ich nicht ausschließen kann das ich einen Denkfehler habe, frage ich eben auch ob ihr dort vielleicht mich aufklären könnt warum diese beiden Befehle so negativ behaftet sind?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name
nemored



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

BeitragVerfasst am: 28.03.2009, 10:18    Titel: Antworten mit Zitat

[my2ct]Ich würde GOSUB durchaus schon in die strukturierte Programmierung einordnen. Allerdings muss hier der Programmierer nicht nur darauf achten, nicht versehentlich in das Unterprogramm zu springen, sondern auch darauf, den Rücksprung nicht zu vergessen. Bei SUBs meckert der Compiler rechtzeitig, wenn er kein END SUB findet. Zusammen mit Parameterüber- und Rückgabe, sehe ich keinen vernünftigen Grund GUSUB statt SUB zu verwenden - außer vielleicht Schreibarbeit, weil man GOSUB nicht vorher deklarieren muss, und der Zugriff auf alle Variablen des Hauptprogramms (was nicht nur ein Vorteil ist).

Fakt ist, dass man bei starkem GOTO-Gebrauch leichter die Übersicht verlieren kann als bei SUBs/FUNCTIONs. Gegen einen sehr dezenten Einsatz von GOTO habe ich persönlich nichts einzuwenden, dieser muss aber wohl überlegt sein. Ich bin in den letzten 15 Jahren komplett ohne GOTO ausgekommen, und vielleicht vier, fünf Mal hätte sich das Problem mit GOTO etwas eleganter lösen lassen - also nicht allzu oft. Der Unterschied besteht meines Erachtens nicht in der Verwendung/Nichtverwendung dieses Befehls, sondern in der Denkweise: denke ich mir das Programm als eine einzige Befehlsabfolge, die quer durch den Quelltext springt, oder als Gruppen von Unterprogrammen, die nacheinander aufgerufen werden? Ein Fehler, den ich schon öfter bei der ersten Verwendung von SUBs gesehen habe, ist der Missbrauch von SUB als GOTO-Ersatz. Und dann rennt einem eben schnell mal der Speicherplatz davon ...

Um dein Beispiel "Starte Spiel von vorn" aufzugreifen: Mit GOTO ist der dahinter stehende Gedanke: "Fange das ganze nochmal von vorn an", während mit DO...LOOP der Gedanke ist "Mache das ganze solange, bis das Spiel beendet werden soll". Ich denke, dass letzterer eher dem Programmablauf entspricht. (Nebenbei: in der Schleife kann ich die benötigten Variablen zu Beginn "immer wieder neu" deklarieren, während ich sie bei GOTO außerhalb der "Schleife" deklarieren und innerhalb zurücksetzen muss - Gefahr, das Zurücksetzen zu vergessen)

Ein für mich eingängigeres Beispiel wäre das Beenden des Programms:
Code:
IF programmende THEN GOTO Stelle_an_der_Speicher_freigegeben_wird_usw

Auch das lässt sich immer ohne GOTO lösen, ist aber ohne GOTO nicht unbedingt übersichtlicher als mit.[/my2ct]

(War jetzt ziemlich viel Text für 2ct grinsen )
_________________
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
AQUA-MAN



Anmeldungsdatum: 26.03.2009
Beiträge: 15

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

nemored hat Folgendes geschrieben:

Um dein Beispiel "Starte Spiel von vorn" aufzugreifen: Mit GOTO ist der dahinter stehende Gedanke: "Fange das ganze nochmal von vorn an", während mit DO...LOOP der Gedanke ist "Mache das ganze solange, bis das Spiel beendet werden soll". Ich denke, dass letzterer eher dem Programmablauf entspricht. (Nebenbei: in der Schleife kann ich die benötigten Variablen zu Beginn "immer wieder neu" deklarieren, während ich sie bei GOTO außerhalb der "Schleife" deklarieren und innerhalb zurücksetzen muss - Gefahr, das Zurücksetzen zu vergessen)

Was meinst du mit "immer wieder neu" deklarieren? Deklarieren kann man sie doch nur einmal. Das mit dem Zurücksetzen hab ich ganz gut im Griff dadurch das ich die Variablen immer erst dann zurücksetze bevor sie benutzt werden, also ist das eigentlich über das ganze Hauptprogramm verteilt.
Ich glaube da gibt es etwas was ich noch nicht weiß über das deklarieren.

Das ich GOTO in diesem Beispiel bevorzuge liegt auch an der IDE (FBEdit) die rückt mir dann nämlich alles ein wenn ich es in eine DO..LOOP-Schleife packe.

Hm, was haltet ihr eigentlich von der Idee das ich z.B. eine Variable, die die Runden zählt im Spiel, als BYTE deklariert habe? Da ich bezweifele das es mehr als 127 Runden werden und ich das Spiel sowieso nach spätestens 100 Runden abbrechen lasse, habe ich mir gedacht das es so am besten wäre was den Speicherverbrauch und die Rechenintensivität angeht.
Oder sollte ich aus einem bestimmten Grund eher INTEGER verwenden? Ich meine gelesen zu haben das INTEGER besser zu berechnen sind für noch nicht SO alte Prozessoren weil beide 32 Bit haben, andererseits verbrauchen sie aber auch mehr Speicherplatz der nicht genutzt wird.
Ich wollte mir gleich von Anfang an angewöhnen so Speicherarm wie möglich zu programmieren, bin mir aber nichts so ganz sicher ob es nicht vielleicht zwar ein Guter Wille ist, aber einfach der falsche Weg.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 28.03.2009, 17:47    Titel: Antworten mit Zitat

AQUA-MAN hat Folgendes geschrieben:
Oder sollte ich aus einem bestimmten Grund eher INTEGER verwenden? Ich meine gelesen zu haben das INTEGER besser zu berechnen sind für noch nicht SO alte Prozessoren weil beide 32 Bit haben, andererseits verbrauchen sie aber auch mehr Speicherplatz der nicht genutzt wird.
Ich wollte mir gleich von Anfang an angewöhnen so Speicherarm wie möglich zu programmieren, bin mir aber nichts so ganz sicher ob es nicht vielleicht zwar ein Guter Wille ist, aber einfach der falsche Weg.

FreeBASIC ist in & für 32Bit Systeme geschrieben, daher sind die Speicherzugriffe und Rechenoperationen für 32Bit optimiert.

Das Problem "GOTO / GOSUB" taucht immer wieder auf, evtl. kann dich dieses Tutorial überzeugen zwinkern
http://www.freebasic-portal.de/index.php?s=tutorials&id=6
_________________
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
AQUA-MAN



Anmeldungsdatum: 26.03.2009
Beiträge: 15

BeitragVerfasst am: 28.03.2009, 19:02    Titel: Antworten mit Zitat

"aber einfach der falsche Weg." - Gut das ich gefragt habe, aber ist das mit BYTE statt INTEGER dann wenigstens Speichersparend oder auch nicht?

Das Tutorial hatte ich schon gelesen, und ich gebe zu ich habe eine Anregung bekommen, aber ich glaube das mit GOTO verbuche ich lieber unter persönlichen Programmierstil. zwinkern

Ich habe so viele Fragen, ich glaube da seit ihr noch ein bisschen mit beschäftigt, zumindest falls es nichts ausmacht das ich diesen Thread dafür benutze und nicht für jede Frage einen eigenen Thread aufmache. grinsen

OK, nächste Frage: Haben Konstanten eigentlich einen Vorteil gegenüber normalen Variablen? OK, sie können nicht verändert werden, aber wenn ich sowieso nicht vorhabe sie zu verändern kann mir das doch egal sein als was ich sie deklariere oder?
Ah, habe grade bei CONST gelesen das Konstanten "in allen Prozeduren und in jedem Modul verfügbar sind", das bedeutet da kann es auch mal zu Komplikationen kommen wenn ich mit #INCLUDE anderen Quellcode einbinde und dort schon Konstanten verwendet werden?
Ja, ich habe dieses Tutorial gelesen und die meisten anderen dort auch.

Ich habe irgendwie immer Probleme Kommentare zu schreiben, also damit was ich schreiben soll, ich meine, für mich ist das alles völlig klar und verständlich, weshalb ich mich dann nicht so richtig in die Lage versetzen das ich meinen Code eben nicht kenne.
Kennt jemand so aus dem Stehgreif einen Quellcode der gut Kommentiert ist damit ich da noch ein bisschen von lernen kann?
Im von volta geposteten Tutorial ist zwar auf Seite 2 der Satz "Kommentiere nicht das Offensichtliche, sondern das Unsichtbare!" aber wenn ich nur danach gehe dann kämmen bei mir nur alle 20 Zeilen mal ein Kommentar.

Danke an alle die sich bisher schon Gedanken gemacht haben und auch an die die dann auch was geschrieben haben.
Falls jemand sich noch zur GOTO-Diskussion äußern möchte würde ich ihn bitten das auch zu tun, mich interessiert ob es wirklich so viele Menschen gibt die das auch so sehen mit dem verbieten.
Und bitte überseht meine 1. Frage (die mit dem deklarieren in einer Schleife) im vorherigen Beitrag von mir nicht.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 28.03.2009, 20:21    Titel: Antworten mit Zitat

Alles hat zwei Seiten:
BYTE statt INTEGER?
spart Speicherplatz ; langsamer (aus dem Speicherzugriff 32Bit müssen die 8Bit für das Byte herausgepopelt werden)

Haben Konstanten eigentlich einen Vorteil?
jain, im Programm erspart es (nicht immer verwundert ) Speicherzugriffe (Zeit); aber wie du richtig bemerkt hast, sie dürfen nur einmal definiert werden.
(Alle Werte die man einer Variablen direkt zuweist und im Programmablauf nicht geändert werden kann man auch als Konstante definieren!)

immer Probleme Kommentare zu schreiben? ich auch verlegen
nur alle 20 Zeilen mal ein Kommentar? wenigstens etwas grinsen

GOTO verbieten?
kann mir keiner verbieten; irgendwann merkt man selber, dass es ohne Goto/Gosub übersichtlicher wird.

Und bitte überseht meine 1. Frage (die mit dem deklarieren in einer Schleife) im vorherigen Beitrag von mir nicht.???
habe ich nicht geschnallt...
_________________
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
AQUA-MAN



Anmeldungsdatum: 26.03.2009
Beiträge: 15

BeitragVerfasst am: 28.03.2009, 20:27    Titel: Antworten mit Zitat

volta hat Folgendes geschrieben:

Und bitte überseht meine 1. Frage (die mit dem deklarieren in einer Schleife) im vorherigen Beitrag von mir nicht.???
habe ich nicht geschnallt...


Diese Frage:
AQUA-MAN hat Folgendes geschrieben:

nemored hat Folgendes geschrieben:

Um dein Beispiel "Starte Spiel von vorn" aufzugreifen: Mit GOTO ist der dahinter stehende Gedanke: "Fange das ganze nochmal von vorn an", während mit DO...LOOP der Gedanke ist "Mache das ganze solange, bis das Spiel beendet werden soll". Ich denke, dass letzterer eher dem Programmablauf entspricht. (Nebenbei: in der Schleife kann ich die benötigten Variablen zu Beginn "immer wieder neu" deklarieren, während ich sie bei GOTO außerhalb der "Schleife" deklarieren und innerhalb zurücksetzen muss - Gefahr, das Zurücksetzen zu vergessen)

Was meinst du mit "immer wieder neu" deklarieren? Deklarieren kann man sie doch nur einmal. Das mit dem Zurücksetzen hab ich ganz gut im Griff dadurch das ich die Variablen immer erst dann zurücksetze bevor sie benutzt werden, also ist das eigentlich über das ganze Hauptprogramm verteilt.
Ich glaube da gibt es etwas was ich noch nicht weiß über das deklarieren.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name
nemored



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

BeitragVerfasst am: 29.03.2009, 00:31    Titel: Antworten mit Zitat

Eine Schleife ist im aktuellen FreeBASIC ein Scope-Block. Wenn du innerhalb einer Schleife eine neue Variable einführst, ist sie außerhalb der Schleife nicht mehr gültig. Du kannst auch eine Variable außerhalb der Schleife deklarieren und innen dann nochmal lokal neu einführen.
_________________
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
AQUA-MAN



Anmeldungsdatum: 26.03.2009
Beiträge: 15

BeitragVerfasst am: 29.03.2009, 11:47    Titel: Antworten mit Zitat

Ach so, ja schon, aber um das nutzen zu können, müsste man doch 2 Schleifen ineinander verschachteln, oder? Ich stell mir das momentan so vor:
Code:
DO
  DO
    ' Variablen Deklarieren
    '
    ' Und
    ' das
    ' ganze
    ' Hauptprogramm
    '
    '
    ' Eventuelle Auswertung
  LOOP
  ' Nochmal? Wenn nein, dann EXIT DO
LOOP

Ist das so richtig?


Edit:

Kurze Zwischenfrage:
Bei
Code:
IF RateZahl + 8 => UserZahl AND RateZahl - 8 <= UserZahl THEN
meckert der Compiler rum:
Zahlenraten.bas(92) error 32: Expected 'THEN', found '=>' in 'IF RateZahl + 8 => UserZahl AND RateZahl - 8 <= UserZahl THEN'"
Was hat das zu bedeuten, da steh doch am Ende ein THEN, warum sucht er schon dort vorne ein THEN? Und wie kann ich das Problem lösen, denn dadurch wird auch vieles nachfolgende als Fehlerhaft erkannt?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 29.03.2009, 15:54    Titel: Antworten mit Zitat

Also wenn mir der Compiler meckert, dann probier ich halt rum, bis ich weiß warum...
Bei dir ist das Problem, dass du die Zeichen falschrum gesetzt hast.

Code:
IF RateZahl + 8 >= UserZahl AND RateZahl - 8 <= UserZahl THEN


so gehts.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
AQUA-MAN



Anmeldungsdatum: 26.03.2009
Beiträge: 15

BeitragVerfasst am: 29.03.2009, 16:03    Titel: Antworten mit Zitat

Ja, rumprobieren ist auch eine Möglichkeit, aber ich hatte dort einfach keinen Fehler gesehen. Als was interpretiert der Compiler "=>" wenn es eine andere Bedeutung für ihn hat als ">="?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 29.03.2009, 17:14    Titel: Antworten mit Zitat

Als Fehler Zunge rausstrecken

Ist halt ab und zu so, keine Gedanken darüber machen und einfach weiter coden zwinkern
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


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

BeitragVerfasst am: 29.03.2009, 17:50    Titel: Antworten mit Zitat

Zuweisung von Array-Inhalten:
[code]
Dim As Integer feld(0 to 3) => {1, 3, 3, 7}
[code]
_________________
» 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
AQUA-MAN



Anmeldungsdatum: 26.03.2009
Beiträge: 15

BeitragVerfasst am: 29.03.2009, 22:13    Titel: Antworten mit Zitat

Danke, jetzt versteh ich den Grund zumindest genauer, auch wenn ich noch nicht verstehe warum der Compiler sowas im Vergleichsteil eines IF-Blocks vermutet. Aber wie MOD schon gesagt hat.
Keine Gedanken drüber machen und weiter coden. zwinkern
Muß man 2 Schleifen ineinander verschachteln um Variablen immer wieder neu zu deklarieren? Ich stell mir das momentan so vor:
Code:
DO
  DO
    ' Variablen Deklarieren
    '
    ' Und
    ' das
    ' ganze
    ' Hauptprogramm
    '
    '
    ' Eventuelle Auswertung
  LOOP
  ' Nochmal? Wenn nein, dann EXIT DO
LOOP

Ist das so richtig?

Noch eine Frage zu den Kommentaren, auf was für eine Breite sollte ich sie beschränken, ich habe eine Auflösung von 1600x1200 und benutze FBEdit immer als maximiertes Fenster, da das aber nicht der alltägliche Zustand sein dürfte bei anderen, dachte ich so an eine Breite von 120-130. 80 ist definitiv zu wenig, da sind einige Befehle ja schon länger wegen den Einrückungen oder bei PRINT-Anweisungen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name
nemored



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

BeitragVerfasst am: 29.03.2009, 23:13    Titel: Antworten mit Zitat

Wieso zwei Schleifen?
Code:
DIM AS INTEGER algemein1, algemein2, allgemein3   ' bleiben nach dem "Neustart" erhalten
DO
  DIM AS INTEGER speziell1, speziell2   ' sollen beim "Neustart" neu belegt werden
  DIM AS STRING antwort
  PRINT "Das ist nur ein Demoprogramm und schon wieder zu Ende."
  INPUT "Noch einmal starten? (j/n)", antwort
LOOP WHILE antwort = "j"

(nicht getestet, aber geht ja nur um den prinzipiellen Ablauf)
_________________
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
Muttonhead



Anmeldungsdatum: 26.08.2008
Beiträge: 565
Wohnort: Jüterbog

BeitragVerfasst am: 29.03.2009, 23:21    Titel: Antworten mit Zitat

ich hätte es auch mit 2 loops gemacht
grinsen

Code:

'Variablen deklarieren
DO
  'Variablen auf Anfangswert setzen
  DO
    'Raterunde
    'Abbruchbedingung setzen wenn richtig geraten oder maximale
    'Rateversuche erreicht
  LOOP UNTIL Abbruchbedingung
  'Auswertung
  'Frage "Neues Spiel???"
  'Abbruchbedingung setzen wenn kein neues Spiel
LOOP UNTIL Abbruchbedingung
END


Mutton
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
AQUA-MAN



Anmeldungsdatum: 26.03.2009
Beiträge: 15

BeitragVerfasst am: 29.03.2009, 23:39    Titel: Antworten mit Zitat

Naja es ging ja um das "immer wieder neu deklarieren" und habe mich auf deine spätere Aussage
nemored hat Folgendes geschrieben:
Eine Schleife ist im aktuellen FreeBASIC ein Scope-Block. Wenn du innerhalb einer Schleife eine neue Variable einführst, ist sie außerhalb der Schleife nicht mehr gültig.

bezogen. Deswegen dachte ich man müßte ein Schleife machen die durchlaufen wird bis das ganze Programm irgendwann vollständig beendet wird (die äußere Schleife) und dann eine 2. Schleife darin, in der die Variablen deklariert werden und das Programm an sich läuft. Wenn das Programm soweit fertig ist und abfragen möchte ob es das alles nochmal machen soll, wird aus der inneren Schleife gesprungen wodurch alle dort drinnen deklarierten Variablen ungültig werden bzw. gelöscht werden und eventuell beim nächsten Durchlaufen der inneren Schleife neu deklariert werden.
Denn eine Variable kann ja nur einmal deklariert werden, also muß irgendwie der Bezeichner freigegeben werden um ihn dann wieder neu deklarieren zu können wodurch dann ja auch alle Werte wieder auf 0 bzw. "" sind.
Oder hab ich da was falsch verstanden?
Edit: Da war ich wohl etwas langsam verlegen , das ganze ist an Nemored gerichtet.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name
nemored



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

BeitragVerfasst am: 29.03.2009, 23:43    Titel: Antworten mit Zitat

Hmm ja, ich dachte jetzt nicht an das spezielle Programm, sondern allgemein an Variablen in Schleifen. lächeln

Zitat:
dachte ich so an eine Breite von 120-130. 80 ist definitiv zu wenig, da sind einige Befehle ja schon länger wegen den Einrückungen oder bei PRINT-Anweisungen

Da gibt es wohl keine Vorschrift; ich versuche mit so um die 90 Zeichen auszukommen. Wenn dir eine Zeile zu lang ist, kannst du sie übrigens mit einem Unterstrich umbrechen.
Code:
IF bedingung1 = erfuellt AND bedingung2 = erfuellt AND _
      bedingung3 = erfuellt THEN tueWasNoetigIst



Nachtrag (auch ich werde langsam):
Probiere mal das hier:
Code:
DIM AS INTEGER i = 1
DO
  DIM AS INTEGER i = 5
  PRINT i
LOOP UNTIL 1+1=2
PRINT i

_________________
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
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
Seite 1 von 1

 
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