 |
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 |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1293 Wohnort: Ruhrpott
|
Verfasst am: 09.11.2024, 13:03 Titel: |
|
|
| Revilo hat Folgendes geschrieben: | Mir ist aber aufgefallen, dass es dort auch den return-Befehl gibt.
Return False oder Return True, je nach dem.
Und damit bin ich wieder bei meiner Frage: "Wohin, an welche Variable, werden True bzw. Flase denn übergeben?
Den Befehl Return kenne ich in Q-Basic nur als Abschluss einer
GOSUB-Anweisung. Man kehrt dann zurück zu der Stelle, wo GOSUB aufgerufen wurde.
|
Zumindest diese Frage kann ich dir beantworten. Auch in QBasic gibt es SUBs und FUNCTIONs. Die erstellst du im QB-Editor über Bearbeiten -> neue SUB... bzw. Bearbeiten -> neue FUNCTION....
Hier mal ein ganz einfaches Beispiel: | Code: | DECLARE FUNCTION maldrei% (wert%)
ergebnis% = maldrei%(5)
PRINT ergebnis%
FUNCTION maldrei% (wert%)
maldrei% = wert% * 3
END FUNCTION |
Du siehst: Das Ergebnis der Funktion wird an die aufrufende Programmzeile übergeben. In freeBASIC könnte man auch schreiben: | Code: | FUNCTION maldrei% (wert%)
RETURN wert% * 3
END FUNCTION |
Das funktioniert in QBASIC nicht. Dort muss die Zuweisung an den Funktionsnamen erfolgen.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
| Nach oben |
|
 |
Revilo
Anmeldungsdatum: 26.12.2022 Beiträge: 188
|
Verfasst am: 09.11.2024, 16:56 Titel: |
|
|
Hallo Berkeley,
vielen Dank für den Tipp mit Quote.
Darauf muss man erst mal kommen. Quote kenne ich als mathematischen Ausdruck (Anteil von etwas) - wie z.B. die Einschaltquote.
Wer ahnt denn schon, dass sich dahinter die Möglichkeit verbirgt, Zitate anzugeben?
Du schreibst:
Einfach den "Quelltext" anschauen, relativ selbsterklärend...
Meinst du mit "anschauen" den Text markieren?
Ich habe es über Quote ebenso versucht, wie über Zitat oben rechts.
Beides hat nicht funktioniert. Wahrscheinlich habe ich in der
Vorgehensweise irgend etwas falsch gemacht.
In der Vorschau war jedenfalls kein gewünschtes Ergebnis zu sehen.
Wie müsste ich es machen, damit es klappt?
Zum Thema Boolean:
Dazu schreibst du:
Aber benutz' trotzdem normale Arrays. DIM AS BOOLEAN feld(9,9,9) - x,y,v, wobei die v-"Dimension" enthüllt, ob eine Nummer fest steht oder nicht. Wenn in feld(5,5,v) von v=1 bis v=9 nur noch ein einziger Wert "TRUE" ist, dann ist DAS der Lösungswert für das zentrale Feld mit den Koordinaten 5,5.
In Q-Basic ist Boolean als Datentyp gar nicht bekannt.
Zum Thema DO - Loop:
Sicherlich ist es ohne Ausstieg mit exit do eine Endlosschleife. Das hatte ich vergessen, zu erwähnen. Sorry
Zum Speichern der Zwischenergebisse:
Ich betrachte jede Zelle (z, s, w ) quasi als Turm in einem Wohnhaus mit 9 Etagen. Ist eine Etage w belegt, kann sie nicht von einem anderen "Mieter" belegt werden, ist also für andere verschlossen. Ein neuer "Mieter" kann halt nur noch dort einziehen, wo noch was frei ist.
Dabei steht "0" für noch frei
"1" für belegt/vergeben
"-1" für andere verschlossen
Wie kann man das bei der Rekursion umsetzten?
Gruß Revilo |
|
| Nach oben |
|
 |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1293 Wohnort: Ruhrpott
|
Verfasst am: 09.11.2024, 20:34 Titel: |
|
|
| Revilo hat Folgendes geschrieben: | Zum Speichern der Zwischenergebisse:
Ich betrachte jede Zelle (z, s, w ) quasi als Turm in einem Wohnhaus mit 9 Etagen. Ist eine Etage w belegt, kann sie nicht von einem anderen "Mieter" belegt werden, ist also für andere verschlossen. Ein neuer "Mieter" kann halt nur noch dort einziehen, wo noch was frei ist.
Dabei steht "0" für noch frei
"1" für belegt/vergeben
"-1" für andere verschlossen |
Das geht doch auch einfacher, mit einem zweidimensionalen Array (9 Zeilen / 9 Spalten) aus 16-bit-Zahlen (INTEGER bei QBasic / SHORT bei freeBASIC), von denen nur die hinteren 9 Bits genutzt werden. Jedes Bit steht für eine bestimmte Zahl.
| Code: | '00000000 00000000
' | ||||||||_'1' ist möglich (1)
' | |||||||__'2' ist möglich (2)
' | ||||||___'3' ist möglich (4)
' | |||||____'4' ist möglich (8)
' | ||||_____'5' ist möglich (16)
' | |||______'6' ist möglich (32)
' | ||_______'7' ist möglich (64)
' | |________'8' ist möglich (128)
' |__________'9' ist möglich (256) |
Bits von Zahlen, die möglich sind, werden gesetzt. Ist nur noch ein Bit gesetzt, d.h. der Wert des Arrayelements ist eine der Zahlen in den Klammern, ist das Feld eindeutig bestimmt.
Da QB im Gegensatz zu FB keine Bitoperations-Schlüsselwörter kennt, müsstest du dir die entsprechenden Prozeduren selber schreiben. Das ist aber auch kein Hexenwerk.
| Code: | ' Bit setzen: wert = wert OR <bitwert>
'Bit löschen: wert = wert AND (511 - <bitwert>)
' Bit prüfen: ergebnis = wert AND <bitwert> | Wobei <bitwert> der oben im Klammern genannte Wert ist.
Beim Prüfen gilt: Ist das Ergebnis 0, ist das Bit gelöscht, ist das Ergebnis ungleich 0, ist das Bit gesetzt.
Gruß
grindstone
PS: Nur so ein Gedanke, der mir gerade kommt: Wäre es möglich, ein Sudoku mit der brute force - Methode zu lösen, also einfach alle Zahlen durchprobieren, bis die Lösung gefunden ist, oder würde das wie beim Schach mehrere Jahrhunderte dauern? _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
| Nach oben |
|
 |
Berkeley
Anmeldungsdatum: 13.05.2024 Beiträge: 115
|
Verfasst am: 09.11.2024, 21:40 Titel: |
|
|
| Revilo hat Folgendes geschrieben: |
vielen Dank für den Tipp mit Quote
...
Wer ahnt denn schon, dass sich dahinter die Möglichkeit verbirgt, Zitate anzugeben? |
- Ist das englische Wort für "zitieren".
| Revilo hat Folgendes geschrieben: |
Du schreibst:
| Berkeley hat Folgendes geschrieben: |
Einfach den "Quelltext" anschauen, relativ selbsterklärend... |
Meinst du mit "anschauen" den Text markieren? |
Nein, wenn du auf "Zitieren" drückst, kriegst du einen Text in einem Eingabefenster, und DA drin siehst du u.a. den [ quote ]-Tag in Aktion. Das ist der so genannte "BBCode", den du nicht deaktiveren darfst (Häkchen darunter).
Letztlich ist es nur umgeformtes HTML, statt <b>...</b> macht man halt [ b ]...[ /b ]. Die Forensoftware hier ist nicht gerade die beste...
| Revilo hat Folgendes geschrieben: |
In Q-Basic ist Boolean als Datentyp gar nicht bekannt. |
Dann definiert man ihn sich händisch wenn es geht, oder nimmt einfach BYTE, 0 entspricht FALSE, -1 TRUE.
| Revilo hat Folgendes geschrieben: |
Zum Speichern der Zwischenergebisse:
Ich betrachte jede Zelle (z, s, w) quasi als Turm in einem Wohnhaus mit 9 Etagen. |
Kommt in etwa hin.
| Revilo hat Folgendes geschrieben: |
Ist eine Etage w belegt, kann sie nicht von einem anderen "Mieter" belegt werden |
Eine Etage wären z mal s => 9x9 "Wohnungen", also auch 81 "Mieter"...
| Revilo hat Folgendes geschrieben: |
Wie kann man das bei der Rekursion umsetzen?
|
Eine Rekursion macht IME keinen Sinn. Rekursion ist, wenn eine Funktion sich selbst aufruft, um mit einem ermittelten Wert einen neuen Wert zu ermitteln. Ein Beispiel wäre die Berechnung der Nachkommastellen von Pi. Mit jedem Aufruf wird eine Stelle berechnet, das Zwischenergebnis wird für die nächste Stelle gebraucht.
Beim Sudoku kannst du im Grunde einmal das ganze Spielfeld durchackern mit
| Code: |
FOR z=1 TO 9
FOR s=1 TO 9
...
NEXT
NEXT
|
Es gibt mehrere Möglichkeiten wie du das dann machst. Viel eleganter wär's auch einfach mit Bitmustern: pro Feld 9 Bits, was du ja rein theoretisch mit dem BOOLEAN-Array hättest. Das wär' eine Integer-Zahl mit einem Wert von 1 bis 511, aber das ist fürs Erste zu kompliziert...
Für QBASIC kann ich dir eh keinen verlässlichen Code liefern. Vermutlich ist ein "DIM SHARED feld(10,10,10) AS BYTE" notwendig...
Die letzte Dimension von feld(s,z, ) ist "mögliche Ziffer", also von 1 bis 9, ob in das Feld die Zahl 1 bis 9 rein kann. Zu Beginn setzt du jedes Feld auf TRUE/-1, dann gibst du die Werte vom zu lösenden Sudoku ein und dann eliminiert dein Algorithmus die falschen Zahlen, bis nur noch die richtige Lösung übrig bleibt.
Hierbei kann man ein wenig optimieren: anstatt dass du eine Schleife machst und bei feld(a,b,c) von c=1 bis c=9 ermittelst, ob nur noch eine einzige Zahl übrig ist, schreibst du diese Zahl einfach in feld(a,b,0), das ist auch gleichbedeutend mit einem gesicherten Wert. Entsprechend schreibst du eine 3 in Spalte 6 Zeile 4 auch mit feld(6,4,0)=3 - wobei du aber auch z.B.
| Code: | FOR c=1 to 9
feld(6,4,c)=0 ' FALSE
NEXT
feld(6,4,3)=-1 ' TRUE
|
machst. Außerdem sollten beim Programmbeginn alle feld(x,y,0) auf 0 gesetzt werden, im Grunde ginge auch -1, ist schließlich auch kein gültiger Wert.
Typischer Fall für ein Unterprogramm, z.B. SETZEN (x, y, zahl): setzt den Inhalt eines Kästchens auf die angegebene Zahl. feld(x,y,0) wird auf zahl gesetzt, und alle sonstigen feld(x,y...) bis auf feld(x,y,zahl) werden auf 0/FALSE gesetzt.
In dieser SUB kann man auch gleich alle abhängigen Felder löschen, ist die Zahl z.B. 3, kann die in keinem anderen Feld mehr in der gleichen Box, Zeile oder Spalte vorkommen. Bei jedem der Felder setzt man feld(a,b,3) auf 0/FALSE.
Die Boxkoordinaten kriegt man mittels z und s geteilt durch 3 - INT(wert/3)*3. Die erste Box geht Spalte+Zeile von 1 bis 3, zweite Box Spalte von 4 bis 6, dritte Box Spalte von 7 bis 9.
Eine weitere SUB überprüft, ob sich etwas aufgelöst hat. Wenn feld(x,y,0) noch keinen Wert hat, wird durchgezählt ob unter feld(x,y,1-9) nur noch eins TRUE ist. In dem Fall führt man dann wieder SETZEN mit dieser übriggebliebenen Zahl aus, dabei wird auch gleich feld(x,y,0) gesetzt.
Zu guter Letzt muss man nur durchzählen ob alle feld(x,y,0) gesetzt sind, dann ist das Sudoku gelöst. Braucht nur ne Ausgabefunktion wie:
| Code: |
FOR z AS BYTE=1 TO 9
PRINT "----+---+---+---+---+---+---+---+----"
PRINT "| ";
FOR s AS BYTE=1 TO 9
PRINT STR(feld(s,z,0));" | ";
NEXT
PRINT
NEXT
PRINT "----+---+---+---+---+---+---+---+----"
|
|
|
| Nach oben |
|
 |
Revilo
Anmeldungsdatum: 26.12.2022 Beiträge: 188
|
Verfasst am: 11.11.2024, 02:04 Titel: |
|
|
Hallo Berkeley,
vielen Dank für deine Tipps.
Ich habe über 1 h lang an einer Antwort getippt.
Als ich noch mal nachsehen wollte, ob ich auch auf alle Aspekte deiner Mail eingegangen bin, war meine ganze bisher verfasste Antwort futsch, weg und nicht mehr auffindbar. 1 h tippen für die Katz'.
Solange ich eine Antwort nicht abgeschickt habe, muss ich doch immer wieder darauf zurückkommen können, um sie ggf. zu ergänzen.
Ist hier aber offenbar ein Lotteriespiel.
Da könnte ich aus dem Stand drei Meter hoch aus meiner Hose springen.
So macht Kommunikation echt keinen Spaß.
Bitte entschuldige, dass ich meinen Frust bei dir ablasse. Du kannst natürlich nichts dafür, dass dieses Portal offenbar noch technische Macken hat.
Gruß Revilo |
|
| Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4723 Wohnort: ~/
|
Verfasst am: 11.11.2024, 17:20 Titel: |
|
|
| Zitat: | Hallo Berkeley,
vielen Dank für deine Tipps.
Ich habe über 1 h lang an einer Antwort getippt.
Als ich noch mal nachsehen wollte, ob ich auch auf alle Aspekte deiner Mail eingegangen bin, war meine ganze bisher verfasste Antwort futsch, weg und nicht mehr auffindbar. 1 h tippen für die Katz'. |
Wenn dir das öfters passiert, würde ich dazu raten, die Antwort in einem Textverarbeitungsprogramm oder Texteditor zu tippen und dann von dort heraus in das Textfeld im Forum zu kopieren (Text markieren; Strg+C zum Kopieren in den Speicher; Strg+V zum Einfügen aus dem Speicher). Habe ich bei unzuverlässiger Internetverbindung auch schon so gehandhabt. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
-----
"Das wissen doch sowieso nur Nerdinauten, die Schlaumeierologie studiert haben." - coldmirror |
|
| Nach oben |
|
 |
Berkeley
Anmeldungsdatum: 13.05.2024 Beiträge: 115
|
Verfasst am: 11.11.2024, 21:55 Titel: |
|
|
| Revilo hat Folgendes geschrieben: | Hallo Berkeley,
vielen Dank für deine Tipps.
Ich habe über 1 h lang an einer Antwort getippt.
Als ich noch mal nachsehen wollte, ob ich auch auf alle Aspekte deiner Mail eingegangen bin, war meine ganze bisher verfasste Antwort futsch, weg und nicht mehr auffindbar. 1 h tippen für die Katz'. |
Das Phänomen kenn' ich von anderen Websites - deine "Session" ist beendet, und wie ich schon mal geschrieben habe brauchst du dann normal nur mit dem Browser auf ZURÜCK gehen, dann hast du wieder die Eingabemaske und dein getippter Text sollte drin stehen - zumindest ist das beim Firefox so. Dann einfach erneut auf Absenden drücken, dann wird die "Session" akzeptiert.
Das klappt aber nicht bei allen Websites; manche haben sogar regelrecht ein Interesse daran, dass durch Vor/Zurück der Cache gelöscht wird. Zur Sicherheit sollte man eben seinen Text vor dem Posten mit Strg+A komplett markieren und mit Strg+C kopieren. - Wenn man's nicht vergisst... |
|
| Nach oben |
|
 |
Revilo
Anmeldungsdatum: 26.12.2022 Beiträge: 188
|
Verfasst am: 12.11.2024, 13:17 Titel: |
|
|
Hallo Berkeley,
| Zitat: |
Eine Rekursion macht IME keinen Sinn. Rekursion ist, wenn eine Funktion sich selbst aufruft, um mit einem ermittelten Wert einen neuen Wert zu ermitteln. |
Dieses Zitat verstehe ich nicht. Ist Backtracking nicht auch eine Form der Rekursion? Was bedeutet in diesem Zusammenhang IME?
| Code: | | DIM SHARED feld(10,10,10) AS BYTE |
Als Datentyp ist mir Byte in QBasic nicht bekannt.
| Zitat: | | Eine Etage wären z mal s => 9x9 "Wohnungen", also auch 81 "Mieter"... |
Hier haben wir uns offenbar falsch verstanden.
Mit Turm meine ich die Zelle (z, s). Jeder Turm hat 9 Etagen, also 9 Wohnungen und damit auch nur 9 " mögliche "Mieter" , nicht 81.
9x9 = 81 Wohnungen würden einen Block bilden.
Die Zeilen stehen für die Blickrichtungen Ost-West.
Die Spalten stehen für die Blickrichtungen Nord-Süd.
In keiner Blickrichtung "sieht" ein "Mieter" sich selbst, sondern immer nur andere "Mieter".
Das Thema "Zitieren" habe ich jetzt wohl verstanden.
Ein Zitat ist praktisch ein Klammerausdruck.
Klammer auf --- Zitat --- Klammer zu, also Quote " Zitat" Quote.
Offenbar lag mein Fehler darin, dass ich vergaß, die Klammer wieder zu schließen. Ein wirklich dummer Anfängerfehler. Sorry
Wenn ich dich richtig verstanden habe, darf ich kein Häkchen bei BBCode setzen, denn dann wäre er deaktiviert, richtig?
Gruß Revilo |
|
| Nach oben |
|
 |
Revilo
Anmeldungsdatum: 26.12.2022 Beiträge: 188
|
Verfasst am: 12.11.2024, 14:13 Titel: |
|
|
Hallo grindstone,
vielen Dank für deine Anregung zum Eintragen von Zwischenergebnissen.
| Zitat: | Das geht doch auch einfacher, mit einem zweidimensionalen Array (9 Zeilen / 9 Spalten) aus 16-bit-Zahlen (INTEGER bei QBasic / SHORT bei freeBASIC), von denen nur die hinteren 9 Bits genutzt werden. Jedes Bit steht für eine bestimmte Zahl.
Code:
'00000000 00000000
' | ||||||||_'1' ist möglich (1)
' | |||||||__'2' ist möglich (2)
' | ||||||___'3' ist möglich (4)
' | |||||____'4' ist möglich (
' | ||||_____'5' ist möglich (16)
' | |||______'6' ist möglich (32)
' | ||_______'7' ist möglich (64)
' | |________'8' ist möglich (128)
' |__________'9' ist möglich (256)
Bits von Zahlen, die möglich sind, werden gesetzt. Ist nur noch ein Bit gesetzt, d.h. der Wert des Arrayelements ist eine der Zahlen in den Klammern, ist das Feld eindeutig bestimmt.
Da QB im Gegensatz zu FB keine Bitoperations-Schlüsselwörter kennt, müsstest du dir die entsprechenden Prozeduren selber schreiben. Das ist aber auch kein Hexenwerk.
Code:
' Bit setzen: wert = wert OR <bitwert>
'Bit löschen: wert = wert AND (511 - <bitwert>)
' Bit prüfen: ergebnis = wert AND <bitwert>
Wobei <bitwert> der oben im Klammern genannte Wert ist.
Beim Prüfen gilt: Ist das Ergebnis 0, ist das Bit gelöscht, ist das Ergebnis ungleich 0, ist das Bit gesetzt.
|
Ich muss es allerdings noch etwas auseinanderbröseln, um es zu verstehen:
Wert sind die natürlichen Zahlen von 1 bis 9.
bitwert sind 2-er - Potenzen gemäß Binärsystem. bitwert = 2^(wert-1)
Bitwert sind aber wiederum natürliche Zahlen, richtig?
Das verwirrt mich etwas.
00000000 00000001 ist die bimärdarstellung der natürlichen 1
00000000 00000010 der natürlichen 2
aber:
00000000 00000011 der natürlichen 3
00000000 00000100 der natürlichen 4
.
.
00000000 00001001 der natürlichen 9
Wie passt das mit deiner obigen Darstellung zusammen?
Ich kann es mir nur so erklären:
Den natürlichen Zahlen 1 bis 9 werden hier nicht ihre eigenen Binärcodes zugeordnet, sondern die Binärcodes der jeweils passenden natürlichen Zweierpotenzen.
Durch diesen kleinen Umweg über die Zweierpotenzen erreicht man, dass die natürlichen Werte 1 bis 9 jeweils nur durch ein einziges gesetztes Bit
repräsentiert werden können. Ist das der Trick dabei?
Besteht dabei aber nicht die Gefahr einer Verwechslung und einer Fehlermeldung? Woher weiß der Rechner, dass ich z.B. in eine Zelle den Wert 7 eintrage und nicht etwa 64? Anders gefragt: Wie unterscheidet der Rechner zwischen wert und bitwert?
Gruß Revilo |
|
| Nach oben |
|
 |
Revilo
Anmeldungsdatum: 26.12.2022 Beiträge: 188
|
Verfasst am: 12.11.2024, 18:00 Titel: |
|
|
Hallo grindstone,
| Zitat: | | PS: Nur so ein Gedanke, der mir gerade kommt: Wäre es möglich, ein Sudoku mit der brute force - Methode zu lösen, also einfach alle Zahlen durchprobieren, bis die Lösung gefunden ist, oder würde das wie beim Schach mehrere Jahrhunderte dauern? |
Die brute force - Methode ist absolut sicher. Sie würde auf jeden Fall
irgend wann zur Lösung führen, hat aber einen entscheidenden Haken:
Wenn es nur eine leere Zelle gäbe, wären dort 9 Einträge (1 bis 9) möglich.
Bei zwei leeren Zellen gäbe es aber schon 9*9 = 81 mögl. Einträge.
Bei drei leeren Zellen bereits 9*9*9 = 729 mögl. Einträge.
Die Anzahl der mögl. Einträge würde also exponentiell anwachsen, je mehr freie Zellen existieren.
Jede einzelne Möglichkeit müsste also erst mal bestimmt und dann auf Richtigkeit geprüft werden. Stelle dir das mal z. B. bei 40 noch freien Zellen , also für 9^40 Einträge vor. Deine Befürchtung, es könnte "Jahrhunderte" dauern, ist also durchaus berechtigt.
Aber bei jeder Zelle alle Werte (1-9) durchzuprobieren, ist ja gar nicht nötig.
Wenn in einer Zelle nur noch 2 Werte möglich sind, macht es keinen Sinn, die 7 bereits unmöglichen erneut zu testen.
Das würde die Bearbeitungs-Zeit schon mal erheblich verkürzen.
brute force rastert aber "gnadenlos" jede Zelle für alle Werte von 1 - 9 durch, egal ob sie noch sinnvoll sind oder nicht.
Deshalb ist Rekursion und Backtracking aus meiner Sicht eine wesentlich
effektivere Vorgehensweise.
Rein mathematisch kann ich der Sache folgen.
Mein Problem ist, dies in meinem Qbasic- Sudoku-Löser umzusetzen.
Ich bin es gewohnt, linear also Schritt für Schritt vorzugehen.
Rekursion und Backtracking sind aber Verfahren, die das "Pferd" praktisch von hinten aufzäumen. Das ist eine für mich (noch) ungewohnte Denkweise,
weshalb ich damit erhebliche Probleme habe, obwohl ich sie längst als sehr wirkungsvoll erkannt habe.
Gruß Revilo |
|
| Nach oben |
|
 |
Berkeley
Anmeldungsdatum: 13.05.2024 Beiträge: 115
|
Verfasst am: 12.11.2024, 19:58 Titel: |
|
|
| Revilo hat Folgendes geschrieben: |
| Berkeley hat Folgendes geschrieben: |
Eine Rekursion macht IME keinen Sinn. Rekursion ist, wenn eine Funktion sich selbst aufruft, um mit einem ermittelten Wert einen neuen Wert zu ermitteln. |
Dieses Zitat verstehe ich nicht. Ist Backtracking nicht auch eine Form der Rekursion? |
Rekursion ist, wenn eine Funktion sich selbst aufruft, um mit einem ermittelten Wert einen neuen Wert zu ermitteln. Das KANN bei Backtracking der Fall sein, MUSS aber nicht und ist eben nicht dasselbe. Kann man auf Wikipedia nachlesen...
| Revilo hat Folgendes geschrieben: | | Was bedeutet in diesem Zusammenhang IME? | "In my eyes".
| Revilo hat Folgendes geschrieben: |
| Berkeley hat Folgendes geschrieben: |
| Code: | | DIM SHARED feld(10,10,10) AS BYTE |
|
Als Datentyp ist mir Byte in QBasic nicht bekannt. |
Mir ist QBasic nicht bekannt. Bei C/C++ wär's der Datentyp "char"...
- Kennst du etwa https://www.freebasic-portal.de/befehlsreferenz/ nicht ?
| Revilo hat Folgendes geschrieben: |
| Berkeley hat Folgendes geschrieben: |
Eine Etage wären z mal s => 9x9 "Wohnungen", also auch 81 "Mieter"... |
Hier haben wir uns offenbar falsch verstanden.
Mit Turm meine ich die Zelle (z, s). |
Das wäre ja eine Etage: Zeile mal Spalte. Das Bild hängt eh schief. Zeilen und Spalten sind zwar gleichwertig, aber die Werte die wir darin stapeln, sind keine Stockwerke. Man könnte eher sagen dass wir 10 Kärtchen in jeder "Wohnung" haben, die wir nach und nach rausnehmen. Im Speicher ist es aber so, dass wir für jedes Kärtchen eine eigene Wohnung nehmen.
Das mit den Bits ist die Lösung für Fortgeschrittene, zumindest, um die "möglichen" Zahlen darzustellen. Bit 0 ist 1 und stünde für 1, Bit 1 ist 2 und steht für 2, Bit 2 ist 4 und steht für 3, Bit 3 ist 8 und steht für 4, Bit 4 ist 16 und steht für 5 - und so weiter. Damit kannst du 9 Zahlen in einem 9-Bit-Integer speichern - also natürlich SHORT, dem 16 Bit Integer. Das ersetzt dir 9 BOOLEAN Felder bzw. die dritte Dimension und damit wären wir näher an dem Bild mit den Kärtchen pro Wohnung. Ist aber vorerst zu kompliziert.
Mach' wie gesagt dieses dreidimensionale Array mit den "möglichen" Zahlen, und einer "festgelegten" Zahl. Kümmer' dich erst mal um den Lösungsalgorithmus. Brute Force ist Unsinn. Du musst nur immer wieder jedes Feld prüfen, welche Zahlen möglich sind. Zugehörige Zeile und Spalte durchgehen, und den Block. Unmögliche Zahlen werden gelöscht. Bleibt nur eine Zahl übrig, wird sie gesetzt und diese Zahl bei allen anderen Zellen in der aktuellen Zeile, Spalte und Block gelöscht.
Und das Ganze wird so lange wiederholt, bis für alle Zellen eine Zahl ermittelt ist.
- Es kann in einer Endlosschleife münden, denn nicht immer sind Sudokus eindeutig. Manchmal gibt es zwei richtige Lösungen, man kann zwei Zahlen miteinander vertauschen. Manchmal muss man eine Zahl ausprobieren und sieht erst in Folge, ob es die falsche war. Das Programm muss daher abbrechen, sobald sich bei einem Durchlauf nichts mehr ändert.
Dazu benutzt man ein Flag - das typischerweise eigentlich von Typ BOOLEAN wäre. Alternativ eben einen Integer, der 0 oder -1 (alle Bits gesetzt) ist.
| Code: |
DO
...
haschanged=FALSE ' Änderungs-Flag
solved=0 ' Zahl gelöster Zellen
FOR z=1 TO 9
FOR s=1 TO 9
<Algorithmus>
NEXT
NEXT
IF haschanged=FALSE OR solved=81 THEN EXIT DO
LOOP
|
In <Algorithmus> setzt du haschanged auf TRUE, sobald eine Zelle geändert wird. Außerdem erhöhst du solved um 1 bei jeder Zelle, bei der die Lösungszahl ermittelt wurde. Bei 9x9 Zellen also 81.
Wenn/da du keinen BOOLEAN-Typ hast, machst du haschanged einfach als BYTE oder was QBasic kennt, und nimmst statt TRUE eben -1 oder 1 und statt FALSE einfach 0. |
|
| Nach oben |
|
 |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1293 Wohnort: Ruhrpott
|
Verfasst am: 13.11.2024, 00:30 Titel: |
|
|
| Revilo hat Folgendes geschrieben: |
Ich muss es allerdings noch etwas auseinanderbröseln, um es zu verstehen:
Wert sind die natürlichen Zahlen von 1 bis 9.
bitwert sind 2-er - Potenzen gemäß Binärsystem. bitwert = 2^(wert-1)
Bitwert sind aber wiederum natürliche Zahlen, richtig?
Das verwirrt mich etwas. | Es wäre vielleicht weniger verwirrend, wenn die Sudoku-Felder nicht mit den Zahlen 1 bis 9 gefüllt würden, sondern beispielsweise mit den Buchstaben A bis I (habe ich übrigens auch schon mal gesehen). Die Zahlen in den Feldern und die Werte der Binärzahlen haben so gesehen nichts miteinander zu tun. Jedes gesetzte Bit bedeutet eine mögliche Zahl für dieses Feld. Erst wenn nur noch eins der Bits gesetzt ist, ist das Feld eindeutig bestimmt.
| Zitat: | 00000000 00000001 ist die bimärdarstellung der natürlichen 1
00000000 00000010 der natürlichen 2
aber:
00000000 00000011 der natürlichen 3
00000000 00000100 der natürlichen 4
.
.
00000000 00001001 der natürlichen 9
Wie passt das mit deiner obigen Darstellung zusammen? | Um mal bei dem letzten Beispiel zu bleiben: Die Abfrage des betreffenden Arrayelements liefert einen Wert von 9. Das wiederum entspricht in binärer Darstellung einem Bitmuster von 0000000000001001, und das wiederum bedeutet, daß für dieses Feld die Zahlen 1 und 4 möglich wären.
| Zitat: | Ich kann es mir nur so erklären:
Den natürlichen Zahlen 1 bis 9 werden hier nicht ihre eigenen Binärcodes zugeordnet, sondern die Binärcodes der jeweils passenden natürlichen Zweierpotenzen.
Durch diesen kleinen Umweg über die Zweierpotenzen erreicht man, dass die natürlichen Werte 1 bis 9 jeweils nur durch ein einziges gesetztes Bit
repräsentiert werden können. Ist das der Trick dabei? | Genauso ist es.
| Zitat: | | Besteht dabei aber nicht die Gefahr einer Verwechslung und einer Fehlermeldung? | Verwechslung ja, Fehlermeldung nein.
| Zitat: | | Woher weiß der Rechner, dass ich z.B. in eine Zelle den Wert 7 eintrage und nicht etwa 64? | Von dir. Mit deinem Programm sagst du dem Rechner, was er tun soll. Die Zuordnung von gesetzten Bits zu Zahlen im Sudokufeld geschieht nur in deinem Kopf. Der Rechner weiß davon gar nichts. Er nimmt dir nur das Rechnen ab, nicht das Denken.
| Zitat: | | Anders gefragt: Wie unterscheidet der Rechner zwischen wert und bitwert? | Durch den internen Aufbau des Prozessors. 'wert' ist die Summe aller 'bitwerte'.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
| Nach oben |
|
 |
Revilo
Anmeldungsdatum: 26.12.2022 Beiträge: 188
|
Verfasst am: 17.11.2024, 00:39 Titel: |
|
|
Hallo grindstone,
ich danke dir für deine Versuche, mir zu helfen und weiß sie durchaus zu schätzen.
In manchen Beiträgen nimmst du Bezug auf die Free-Basic-Notation.
Diese beherrsche ich aber nicht. Ich kenne ausschließlich nur Q-Basic.
Wenn man miteinander kommunizieren möchte, funktioniert es nur, wenn sich beide einer Sprache bedienen, die beide auch verstehen.
Deine Free-Basic-Beiträge nehme ich dankend zur Kenntnis, aber sie nützen mir nichts, weil ich Free-Basic nicht verstehe. Sind also vergebliche Mühe deinerseits.
Beispiel:
Wir beide können deutsch und englisch, ich aber zusätzlich auch russisch.
Du bittest mich, den deutschen Begriff "Bahnhof" ins Englische zu übersetzen. Dann würde ich dir "Rail-Station" anbieten.
Damit könntest du etwas anfangen.
Würde ich dir die russische Entsprechung "Wagsal" anbieten, würde es dir mit Sicherheit nicht weiterhelfen, obwohl es im Ergebnis die gleiche Bedeutung wie "Rail-Station" hätte. Mit "Wagsal" würdest du im englischen Sprachgebrauch auf Probleme stoßen, weil dieser Begriff dort gar nicht bekannt ist.
Ich verstehe Free-Basic genauso wenig, wie du Russisch. Bitte lass uns daher künftig bei der gemeinsam bekannten Sprache Q-Basic bleiben.
Einverstanden?
Gruß Revilo |
|
| Nach oben |
|
 |
Revilo
Anmeldungsdatum: 26.12.2022 Beiträge: 188
|
Verfasst am: 17.11.2024, 02:30 Titel: |
|
|
An alle, die mir helfen möchten,
wahrscheinlich habe ich mich nicht klar genug ausgedrückt.
Deshalb befürchte ich, dass wir die ganze Zeit über aneinander vorbei reden.
Daher versuche ich es mal im Pseudocode:
Ich habe ein bestimmtes Sudoku mit bestimmten Ersteinträgen.
Diese Ersteinträge sind im Spielfeld sauber eingetragen und jeweils in allen
relevanten Zeilen, Spalten und Blöcken sauber eliminiert.
Das funktioniert.
Ich suche spielfeldweit nach Zellen, mit nur noch einem einzigen mögl. Eintrag w. Wenn es eine solche Zelle gibt, trage ich w dort ein und eliminiere w zeilen-, spalten- und blockweise soweit, wie möglich.
Das funktioniert auch.
Danach ist eine Zelle entweder sauber gefunden , also bereits feststehend.
Oder in ihr sind noch mind. zwei Einträge möglich.
Hier beginnt das Probieren:
'================
Zelle suchen:
Ich suche die erste Zelle(z, s) mit nur noch zwei mögl. Einträgen w1 , w2.
Einer von beiden, entweder w1 oder w2, muss stimmen.
Ich probiere in der Zelle (z, s) mit dem kleineren Wert w1.
Treffe ich im weiteren Ablauf auf einen Fehler, eine Sackgasse, kann w1 also nicht richtig sein.
Alles, was nach der Wahl von w1 geschehen ist, muss als rückgängig gemacht werden, so als ob es nie geschehen wäre.
Wenn w1 sich als falsch erwiesen hat, kann ich also automatisch w2 für diese Zelle(z, s) als gesichert eintragen und entsprechend eliminieren.
Dann suche ich die nächste Zelle mit ebenfalls nur noch zwei mögl. Einträgen.
Dazu fange ich wieder von vorn an, gehe also zurück zur Marke
Zelle suchen:
Das ganze lasse ich solange/sooft durchlaufen, bis in jede Zelle(z, s) nur noch ein einziger Wert stehen kann. Das muss letztlich die Lösung sein!!!
Der Ablauf an sich, ist mir völlig klar.
Aber wie "übersetzt" man das in Q-Basic?
Gerade das "Rückgängigmachen" einer falschen Wahl bereitet mir (noch) große Probleme.
Gruß Revilo |
|
| Nach oben |
|
 |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1293 Wohnort: Ruhrpott
|
Verfasst am: 17.11.2024, 21:58 Titel: |
|
|
Na ja, um bei dem Bild zu bleiben, das Verhältnis von QBasic zu freeBASIC ist eher wie Hochdeutsch zu Plattdeutsch. Mit etwas gutem Willen kann man sich da durchaus verständigen. Und wer QB kann, kann auch FB, zumal FB auch einen QB-Modus hat.
Aber du hast mich ertappt: Ich versuche ganz dezent, dir FB schmackhaft zu machen, hauptsächlich aus zwei Gründen:
1) FB-Programme laufen ca. 100x schneller als QB-Programme und
2) ist der Original QB-Editor nach heutigen Maßstäben eine Zumutung.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
| Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2533 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 17.11.2024, 22:16 Titel: |
|
|
Zum Thema Sudoku: Von mir gäbe es noch etwas ganz altes:
https://beilagen.dreael.ch/QB/SUDOKU.ZIP
Ist sogar noch original unter MS-DOS entstanden.
Zum Thema FreeBasic vs. QB: Ersteres läuft auf ganz aktuellen Betriebssystemen wie Windows 11 und kann in 64-Bit problem das gesamte RAM eines heutigen PCs nutzen, während QB noch all die Intel 8088/8086-Einschränkungen wie 64 KB-Segmeintierung usw. kennt.
Ausserdem muss für QB inzwischen passende Hardware aus dem Museum geholt werden, ausser man verfrachtet es auf seiner modernen UEFI-Hardware mit Windows 11 in die Emulationslösung DOSBox.
Aus rein wirtschaftlicher Sicht würde ich aber ein Software-Neuprojekt nicht für eine Emulationsumgebung schreiben, sondern letzteres soll eigentlich nur dazu dienen, bereits bestehende Software von ganz früher lauffähig zu halten. Aus diesem Grund würde es also auch mehr Sinn machen, das Sudoku-Projekt in FB mit einer aktuellen Compilerversion auf einer aktuellen Plattform zu entwickeln.
Ansonsten gibt es sie natürlich auch immer noch, die Freaks und Hobbyisten, die noch heute z.B. für den Commodore 64 Spiele schreiben... _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
| Nach oben |
|
 |
SpionAtom
Anmeldungsdatum: 10.01.2005 Beiträge: 397
|
Verfasst am: 18.11.2024, 09:30 Titel: |
|
|
Darum: QB64! Mit eigenem erweitertem Editor. Bis auf die Kompilierungszeit, die unterirdisch ist, ist DAS der Weg heutzutage QB zu programmieren.
Ich bin irgendwann ausgestiegen aus dem ganzen Helfen hier leider. Ich bin mir nicht sicher, ob hier noch richtig was gelernt wird, oder ob hier kleinschrittig nur noch alles vorgekaut wird - nicht böse gemeint.
Dann werden noch irgendwelche Bitmuster vorgeschlagen für den armen Mann, der mit grundlegenden boolschen Operationen schon nicht gut klarkommt.
Ihr macht das schon  _________________ Inzwischen gehöre ich auch zu den BlitzBasicern. Also verzeiht mir, wenn mir mal ein LOCATE 100, 100 oder dergleichen rausrutscht. |
|
| Nach oben |
|
 |
Revilo
Anmeldungsdatum: 26.12.2022 Beiträge: 188
|
Verfasst am: 18.11.2024, 19:01 Titel: |
|
|
Hallo grindstone,
| Zitat: | Um mal bei dem letzten Beispiel zu bleiben: Die Abfrage des betreffenden Arrayelements liefert einen Wert von 9. Das wiederum entspricht in binärer Darstellung einem Bitmuster von 0000000000001001, und das wiederum bedeutet, daß für dieses Feld die Zahlen 1 und 4 möglich wären.
|
Sorry, das verstehe ich (noch) nicht.
Wenn ich den natürlichen Wert 9 in einer Zelle eintrage, weil er sich als sichere Lösung ergeben hat, ist doch in dieser Zelle gar kein anderer Wert mehr möglich, also auch keine 1 und keine 4.
Wenn ich den natürlichen Wert 9 als sichere Lösung eintrage, müsste ich dem Rechner also nebenbei sagen: "Nutze statt der natürlichen 9 aber die Bit-Darstellung von bitwert = 256" also 00000001 00000000."
Bei einer 5 als sichere Lösung, wäre es dann also bitwert = 16.
In Bit-Darstellung also 00000000 00010000."
Allgemein gilt doch wohl: bitwert(wert%) =2^(wert%-1)
Wie bringe ich meinem Rechner dieses "Nutze statt" bei?
| Zitat: |
' Bit setzen: wert = wert OR <bitwert>
'Bit löschen: wert = wert AND (511 - <bitwert>)
' Bit prüfen: ergebnis = wert AND <bitwert>
Wobei <bitwert> der oben im Klammern genannte Wert ist.
Beim Prüfen gilt: Ist das Ergebnis 0, ist das Bit gelöscht, ist das Ergebnis ungleich 0, ist das Bit gesetzt. |
Auch hierzu muss ich leider noch mal nachfragen:
512 wäre die nächsthöhere zweier-Potenz. (2^(10-1)
Warum verwendest du beim löschen ausgerechnet 511 und nicht z.B. 397?
Das hat wahrscheinlich mit den Operatoren "or" bzw. "and" zu tun, wenn ich richtig vermute.
Kannst du mir z.B. für den natürlichen Wert 7 als sicheren Eintrag mal Schritt für Schritt darlegen, wie diese Operatoren digital wirken, welche Auswirkungen sie haben, warum sie genau zu diesem Ergebnis und keinem anderen führen?
Solange ich das nicht "wasserdicht" verstanden habe , werde ich dir nie richtig folgen können. Ich würde mich immer fragen:
Wie kommt man darauf, dass es genau so sein muss und nicht anders sein kann? Wenn ich es einmal "wasserdicht" verstanden habe, werde ich dich damit nie wieder belästigen. Ist das ein Angebot?
Gruß Revilo |
|
| Nach oben |
|
 |
Berkeley
Anmeldungsdatum: 13.05.2024 Beiträge: 115
|
Verfasst am: 18.11.2024, 19:12 Titel: |
|
|
| dreael hat Folgendes geschrieben: | | Aus rein wirtschaftlicher Sicht würde ich aber ein Software-Neuprojekt nicht für eine Emulationsumgebung schreiben, sondern letzteres soll eigentlich nur dazu dienen, bereits bestehende Software von ganz früher lauffähig zu halten. |
Das ist auch irgendwo der Hintergedanke bei meiner RETROGRA-Bibliothek: man kann zwar so EINFACH Projekte erstellen wie früher, aber ohne irgendwelche Einschränkungen - wie z.B. DOSBox starten um überhaupt programmieren zu können. Mir schwebte da ein Pseudo-Homecomputer/Uraltspielkonsole vor, 640x480 Pixel mit 8 bpp bzw. 80x30 Zeichen sind wohl perfekt. Nicht zu viel, sogar eher ne kleine Reserve. "Damals" hatte man nur 16 Farben gleichzeitig bei 320x200...
Man sollte eins nicht vergessen: je hochauflösender, desto mehr Arbeit hat man mit der Grafik. Ein 16x16 Sprite ist schnell gezeichnet. 128x128 dauert ungleich länger. Wer's nicht glaubt, kann's ja an einem Resource-Paket von Minecraft probieren...
Es mag auch etwas Geschick erfordern, mit wenigen Farben und Pixeln das zustande zu kriegen, was man sich vorstellt, aber eine handgemalte Grafik schaut am Ende doch besser aus, als ein Flickwerk aus digitalisierten Fotografien... |
|
| Nach oben |
|
 |
Berkeley
Anmeldungsdatum: 13.05.2024 Beiträge: 115
|
Verfasst am: 18.11.2024, 20:12 Titel: |
|
|
| Revilo hat Folgendes geschrieben: |
Sorry, das verstehe ich (noch) nicht.
Wenn ich den natürlichen Wert 9 in einer Zelle eintrage, weil er sich als sichere Lösung ergeben hat, ist doch in dieser Zelle gar kein anderer Wert mehr möglich, also auch keine 1 und keine 4. |
Doch, eben indem du jedem Bit einer Zahl einen Wert "zuweist" = ein Bit einen Wert repräsentieren lässt.
Bit 0 entspricht im Sudoku der Zahl 1, gesetzt ist es der Wert 1. Bit 1 entspricht 2, gesetzt ist es der Wert 2, Bit 2 entspricht 3, gesetzt ist es der Wert 4. Bit 3 entspricht 4, gesetzt ist es der Wert 8.
Auf diese Weise kannst du in einer Integerzahl mehrere so genannte "Flags" unterbringen. Ein Flag ist praktisch ein Boolean-Wert, Flagge hoch - Flagge runter. So bezeichnet man auch Variablen, die einfach nur irgendeinen Zustand festhalten z.B. "isSaved" ob eine Datei gespeichert wurde oder Veränderungen vorliegen. Man kann aber eben auch mehrere Flags in eine Integer-Zahl packen. Bei 16 Bit-Integer eben 16 Flags.
Wenn man Zweierpotenzen addiert 1+2+4+8+16+32 usw. dann beeinflussen die sich erst mal nicht gegenseitig. Du musst aber u.a. statt Addition OR verwenden. Denn wenn du auf 8 8 addierst, kommt 16 raus, das Bit 3 würde gelöscht und Bit 4 gesetzt. Bei 8 OR 8 oder 0 OR 8 kommt immer 8 raus. Nehmen wir an, dein Integer heißt "Flags", dann testest du Bit 3 mit (Flags AND 8)=8, oder besser: (Flags AND 8)<>0.
Zu jedem Befehlssatz einer CPU gehören nicht nur diese Verknüpfungsoperationen, sondern auch Bitshift und Bitrotation - dabei werden die Bits in einer Integervariable verschoben. SHL und SHR stehen für "shift left" und "shift right". Das war früher recht praktisch, weil man damit sehr schnell mit Zweierpotenzen multiplizieren und dividieren konnte - also mit 2, 4, 8, 16, 32... CISC-CPUs haben dafür teilweise Addition und Subtraktion einfach so oft wiederholt...
SHL 1 ist gleichbedeutend mit *2. SHL 2 ist gleichbedeutend mit *4. Alle Bits in einer Zahl wandern dabei um entsprechend viele Binärstellen nach "links" - mir wär' "nach oben" als Bezeichnung lieber... => es geht auf die menschliche Darstellung von Zahlen zurück. 123 ist binär 01111011. Bit 0 ist ganz rechts. In der Hardware ist die Reihenfolge aber insbesondere bei Little Endian genau andersrum - irgendwie. Das kann schon verwirren.
Bitshift ist jedenfalls unsere elegante Lösung, Bits einfach anzusprechen: (1 SHL bitno) ("bitno" ist die Bitnummer) ergibt den für die Operationen richtigen Wert - die Zweierpotenz. Schwieriger ist, zu testen, ob nur noch ein einziges Bit übrig ist.
| Revilo hat Folgendes geschrieben: |
Wie bringe ich meinem Rechner dieses "Nutze statt" bei?
|
Du musst es gesondert programmieren, also (1 SHL bitno) für jedes Bit. Du kannst BASIC nicht sagen, dass irgendein Bit irgendeiner Zahl entspricht. Wenn du festlegst, dass Bit 3 der Zahl 4 entspricht, darfst du das auch nicht wieder durcheinanderbringen.
Also grundsätzlich eben elegant, aber viel zu übertrieben für ein Anfängerprojekt.
| Revilo hat Folgendes geschrieben: |
Warum verwendest du beim Löschen ausgerechnet 511 und nicht z.B. 397? |
Schau' dir die Zahlen einfach als Binärwert an... Jede Zahl kleiner 1 zu einer Zweierpotenz ist als Binärzahl eine Serie von 1en, 511 z.B. 111111111. 397 ist dagegen 110001101. Wenn man dann noch eine Zweierpotenz abzieht, kann man damit das entsprechende Bit löschen.
| Revilo hat Folgendes geschrieben: |
Kannst du mir z.B. für den natürlichen Wert 7 als sicheren Eintrag mal Schritt für Schritt darlegen, wie diese Operatoren digital wirken, welche Auswirkungen sie haben, warum sie genau zu diesem Ergebnis und keinem anderen führen? |
7 wäre Bit 6, hat den Wert 2^6 oder (1 SHL 6) also 64.
Mit
Flags=Flags OR 64
wird es gesetzt, mit
Flags=Flags AND (511-64)
wird es gelöscht. Normal nimmt man einfach das Zweierkomplement von 64, ob das aber QB bietet...? - Das invertiert eine Binärzahl, löscht also jedes gesetzte Bit und setzt jedes gelöschte Bit in einer Zahl. Quelltextmäßig wäre eine mögliche Schreibweise dafür "NOT 64". Aber das muss der Compiler halt so interpretieren. In C nimmt man die Tilde.
Das Zweierkomplement von 64 ist aber auch einfach -65, mit (-1-64) kämst du aufs gleiche Ergebnis, auch wenn im Speicher dann sämtliche Bits bis auf eines gesetzt sind.
So viel sollte man ja von der Schulinformatik her wissen: bei OR muss nur ein Bit von zweien gesetzt sein und das Ergebnis ist 1, während bei AND beide Bits gesetzt sein müssen damit das Ergebnis 1 ist.
=> Binär ergibt 110 OR 101 = 111 während 110 AND 101 = 100.
Das nennt sich "bitwise"/"bitweise", während die "logische" Verknüpfung nur für TRUE und FALSE gilt. Bei
IF (a=10) AND (b=13) THEN
ergibt a=10 TRUE oder FALSE und b=13 TRUE oder FALSE, und das Ergebnis der AND-Verknüpfung ist nur TRUE oder FALSE, der Wert, der darüber entscheidet, ob's mit THEN weitergeht, oder bei ELSE bzw. ENDIF. Prinzipiell ist es auch ne bitweise Verknüpfung, allerdings eben nur mit einem einzigen Bit. |
|
| 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.
|
|