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:

Qbasic vs. Python

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Revilo



Anmeldungsdatum: 26.12.2022
Beiträge: 178

BeitragVerfasst am: 28.10.2024, 18:06    Titel: Qbasic vs. Python Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 29.10.2024, 10:09    Titel: Antworten mit Zitat

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
Code:
DIM feld(9, 9)

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
Benutzer-Profile anzeigen Private Nachricht senden
SpionAtom



Anmeldungsdatum: 10.01.2005
Beiträge: 395

BeitragVerfasst am: 29.10.2024, 11:44    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Monika



Anmeldungsdatum: 03.07.2025
Beiträge: 2

BeitragVerfasst am: 12.09.2025, 20:09    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Berkeley



Anmeldungsdatum: 13.05.2024
Beiträge: 96

BeitragVerfasst am: 14.09.2025, 20:44    Titel: Antworten mit Zitat

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:
Code:
VARPTR(i%())+7*4.


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
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2530
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 15.09.2025, 20:39    Titel: Antworten mit Zitat

Aufgepasst: Schon in den GW-BASIC-Zeiten gab es
Code:
OPTION BASE 0

bzw.
Code:
OPTION BASE 1

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:
Code:
LBOUND()
UBOUND()

um den niedrigisten und höchsten Index abzufragen. Beispiel 1:
Code:
DIM foo%(4)
PRINT LBOUND(foo%)
PRINT UBOUND(foo%)

gibt logischerweise
Code:
0
4

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
Code:
1
4

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
Code:
3
9

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic. 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