 |
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 |
Revilo
Anmeldungsdatum: 26.12.2022 Beiträge: 178
|
Verfasst am: 28.10.2024, 18:06 Titel: Qbasic vs. Python |
|
|
Hallo Leute,
wenn ich eine Zelle(x, y) definiert habe, spreche ich sie in Qbasic wie folgt an:
for x=1 to 9
for y=1 to 9
print Zelle (x, y)
next y
next x
Das macht Sinn. Denn die 1. Zelle steht halt in Zeile 1 und Spalte 1.
Die letzte Zelle entsprechend in Zeile 9 und Spalte 9.
Python zählt offenbar anders:
for x=0 to 8
for y=0 to 8
print Zelle (x, y)
next y
next x
Hier hätte das 1. Feld des Spielfeldes die Koordinaten Zelle(0, 0).
Nach meinen Q-Basic-Erfahrungen kann es aber keine Zelle(0, 0) geben,
die als 1. Feld angesprochen werden könnte.
Anders gefragt: Wo soll denn diese Zelle(0, 0) im Spielfeld stehen, wenn sie weder Zeile noch Spalte hat?
Hat jemand eine Idee, wie das zusammenpasst?
Ob man einen Sudoku-Löser in Q-Basic oder in Python programmiert ist letztlich egal. Es muss auf jeden Fall dieselbe Lösung herauskommen.
Gruß Revilo |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4709 Wohnort: ~/
|
Verfasst am: 29.10.2024, 10:09 Titel: |
|
|
Python beginnt - wie die meisten Programmiersprachen, die ich kenne - mit der Zählung konsequent bei Index 0. Das heißt ganz einfach, dass das erste Element die Nummer 0 besitzt, das zweite Element die Nummer 1 usw. Das Feld (0,0) greift auf die erste Spalte in der ersten Zeile zu, das Feld (8,8) auf die neunte Spalte des neunten Feldes.
Laut meinem QBasic-Buch (das sich hier mit meiner Erinnerung deckt) startet auch QBasic standardmäßig mit Index 0, d. h. ein
erzeugt in Wirklichkeit nicht 9*9 Einträge, sondern 10*10. Du ignorierst nur einfach die komplette Spalte mit Nummer 0 und die komplette Zeile mit Nummer 0.
Das Verhalten in QBasic kann mit OPTION BASE umgestellt werden. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
SpionAtom
Anmeldungsdatum: 10.01.2005 Beiträge: 395
|
Verfasst am: 29.10.2024, 11:44 Titel: |
|
|
Code: | Dim SudokuBoard(0 to 8, 0 to 8) |
Ich würde Arrays so definieren wie oben angegeben mit expliziter Angabe von erstem und letzten Eintrag, dann sieht einjeder direkt, dass die Indizes von 0 bis 8 laufen.
Es klingt anfangs etwas konter-intuitiv Arrays mit dem Index 0 beginnen zu lassen. Es können dadurch einige mathematische Ausdrücke oder Abfragen eleganter formuliert werden. Letztendlich ist es eine Frage des Geschmacks und wie man es gewohnt ist. _________________ Inzwischen gehöre ich auch zu den BlitzBasicern. Also verzeiht mir, wenn mir mal ein LOCATE 100, 100 oder dergleichen rausrutscht. |
|
Nach oben |
|
 |
Monika
Anmeldungsdatum: 03.07.2025 Beiträge: 2
|
Verfasst am: 12.09.2025, 20:09 Titel: |
|
|
Hallo Revilo,
das liegt daran, dass viele Programmiersprachen wie Python bei 0 zu zählen beginnen („Null-basiert“), während QBasic bei 1 anfängt („Eins-basiert“). Die Zelle (0, 0) in Python entspricht also der ersten Zelle (1, 1) in QBasic. Wenn du in Python wie in QBasic mit 1 starten willst, kannst du range(1, 10) nehmen. Die Position im Spielfeld bleibt die gleiche, nur die Zählweise ist anders. Es ist nur eine Konvention der Sprache.
Viele Grüße! |
|
Nach oben |
|
 |
Berkeley
Anmeldungsdatum: 13.05.2024 Beiträge: 96
|
Verfasst am: 14.09.2025, 20:44 Titel: |
|
|
Obwohl der Thread eigentlich schon alt war...:
Intern arbeitet der Computer mit Offsets. Das Offset ist Feldgröße mal Index. Haben wir 32-Bit-Felder, also 4 Bytes, ist i%(0) die Adresse der Feldvariablen - in BASIC VARPTR(i%()) - plus 0*4. i%(7) ist:
Bei einem 1-basierten Index müsste ich Code: | VARPTR(i%())+(7-1)*4 | rechnen. Das ist eine zusätzliche Rechenoperation, und das kann sich läppern. Ganz speziell bei den 8-Bit-Computern, auf denen BASIC ursprünglich eingesetzt wurde. Da war auch Speicherplatz sauknapp, da hat man nicht einfach im Speicher ein zusätzliches, überflüssiges Feld angelegt. Und dass der Interpreter überhaupt in den ROM gepasst hat war ein Wunder, die einzige Optimierung die man kannte war Größenoptimierung - was immer zu Lasten von Performance geht. Die meisten Programmiersprachen sind auch so alt, dass man keine "menschenfreundlichere" "Formulierung" implementiert hat. Halt erst bei QBasic.
Für alte Hasen jedenfalls ist es kein Beinbruch dass bei DIM i%(10) das erste Feld i%(0) ist, und i%(10) nicht existiert. FreeBASIC ist da natürlich super, weil es ein zusätzliches Feld, also i%(10), mit reserviert, egal, ob der Programmierer Ahnung hat. Hat ja nur Auswirkungen, wenn man z.B. vom Speicher in ne Datei kopieren will. |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2530 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 15.09.2025, 20:39 Titel: |
|
|
Aufgepasst: Schon in den GW-BASIC-Zeiten gab es
bzw.
um bei Arrays den ersten Index zu definieren. Standard ist immer OPTION BASE 0 aktiv. => Somit also ein OPTION BASE 1 vor den DIM-Kommandos platzieren, um Startindex 1 überall bekommen.
Mit QB und natürlich auch FB kann der Index-Bereich mittels TO explizit angegeben werden. Weitere wichtige Funktionen:
um den niedrigisten und höchsten Index abzufragen. Beispiel 1:
Code: | DIM foo%(4)
PRINT LBOUND(foo%)
PRINT UBOUND(foo%) |
gibt logischerweise
aus, d.h. Array von 5 Elemente mit Index 0-4 definiert. Schreibt man es als
Code: | OPTION BASE 1
DIM foo%(4)
PRINT LBOUND(foo%)
PRINT UBOUND(foo%) |
um, so bekommt man
d.h. unser Array belegt im RAM also tatsächlich nur genau 4 Elemente mit Index 1 bis 4.
In QB ist natürlich auch
Code: | DIM foo%(3 TO 9)
PRINT LBOUND(foo%)
PRINT UBOUND(foo%) |
möglich, was also Ausgabe
liefern würde: Array belegt 7 Elemente mit Index 3 bis 9 im RAM. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
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.
|
|