 |
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 |
Powertower
Anmeldungsdatum: 30.03.2011 Beiträge: 8
|
Verfasst am: 26.11.2011, 18:59 Titel: Variablen, Matrix: Fehlerbehebung |
|
|
Hallo alle zusammen ,
Ich benötige eine derartige Geschichte:
Code: | dim as integer n
dim as string gross(n), klein(n)
for n=1 to 26
gross(n)=chr(n+64)
klein(n)=chr(n+96)
next n
|
aber da wollten einfach ein paar Variablen keinen Wert haben
Also habe ich nach dem Problem gesucht:
Code: | dim as integer n
dim as string a(n)
for n= 1 to 5
a(n)="hallo"
next
a(1)="bello"
for n= 1 to 5
print a(n)
next
print a(1) , a(2)
sleep
|
verrät mir jemand warum FB hier abstürzt?
und warum, wenn ich
und
nicht rein packe, der die beiden mit Blatt-Kreuz, zwei Leerzeichen und $ bzw. mit garnix belegt???
vielen Dank, schon mal |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 26.11.2011, 19:01 Titel: |
|
|
bist du mal auf die idee gekommen, n am anfang einen wert zu geben? sonst ist n=0 wenn du das array initialisierst denke ich. _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
 |
Powertower
Anmeldungsdatum: 30.03.2011 Beiträge: 8
|
Verfasst am: 26.11.2011, 19:07 Titel: |
|
|
Das müsste doch die Zuweisung sein... beim ersten mal 1, dann 2 usw...
Ich meine, ich bekomme ja Werte. Aber bei a(n) (n=1 bzw. 2) zickt der; bei allen anderen nicht, nur bei Eins und Zwei !?! |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 26.11.2011, 19:18 Titel: |
|
|
bei a(n) ist n = 0 weil n vorher keinen wert bekommen hat. du benutzt das n schon _vor_ der for-schleife, die zuweisungen aus der for-schleife bringen dir weiter oben nichts. _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
 |
Powertower
Anmeldungsdatum: 30.03.2011 Beiträge: 8
|
Verfasst am: 26.11.2011, 19:31 Titel: |
|
|
eh... ich verstehe nicht ganz was du meinst. n kann doch 0 sein, es bekommt seine Werte ja dann...
wie gesgt: Es klappt ja von 3 bis 26 ohne Probleme aber a(1) und a(2) lassen sich nicht überschreiben bzw. (glaub ich) lassen das ganze abstürzen... die Konsole faselt was von meiner Grafikkarte und verabschiedet sich...
Edit: Ich könnte ja immer von 3 anfangen und die beiden immer umgehen, aber das ist doch nicht richtig so...  |
|
Nach oben |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 26.11.2011, 20:05 Titel: |
|
|
Du initialisierst dein Array mit (0), damit hat dein Array exakt einen Speicherplatz. Wenn du jetzt einen anderen Index als 0 angibst, ist es nur Glück, wenn es nicht gleich abstürzt.
Code: | dim as string gross(1 to 26), klein(1 to 26)
for n as integer =1 to 26
gross(n)=chr(n+64)
klein(n)=chr(n+96)
next |
|
|
Nach oben |
|
 |
Powertower
Anmeldungsdatum: 30.03.2011 Beiträge: 8
|
Verfasst am: 26.11.2011, 20:16 Titel: |
|
|
Achso... sorry MisterD, ich dachte du hättest meine Frage nicht richtig verstanden...
Es klappt (dann hatte ich bis jetzt immer Glück)
Und wie verhält sich das ganze, wenn ich etwas zum mitwachsen haben will?
Code: | Dim as Integer i
Dim as Single y(i)
i=0
do
i=i+1
Input y(i)
loop until y(i) = 0
for i= 1 to (i-1)
print y(i)
next
sleep |
war ja dann auch Glück oder? |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 26.11.2011, 20:41 Titel: |
|
|
Hallo,
hier zwei Beispielprogramme, die das ganze vielleicht etwas verdeutlichen:
Programm 1:
Code: | dim as integer n
'dim as integer n = 5
dim as string a(n)
Print "n hat den Wert " & n
Print "Die untere Grenze des Arrays ist " & LBound(a)
Print "Die obere Grenze des Arrays ist " & UBound(a)
Print "Das heisst, das Array kann genau " & (UBound(a) - LBound(a) + 1) & " Elemente aufnehmen."
Sleep
End |
Programm 2:
Code: | dim as integer n
'dim as integer n = 5
dim as string a(n)
dim as integer arrayAnfang, arrayEnde
arrayAnfang = LBound(a)
arrayEnde = UBound(a)
For i As Integer = arrayAnfang To arrayEnde
a(i) = "(" & i & ") Hallo Welt!"
Next i
For i As Integer = arrayAnfang To arrayEnde
Print a(i)
Next i
Sleep
End |
In beiden Programmen kannst du mal mit den ersten beiden Zeilen experimentieren. Wenn du die erste Zeile
stehenlässt, wird n mit 0 initialisiert. Das Array, was daraus dann erstellt wird, läuft dann von 0 bis 0, hat also genau ein Element, wie das Programm Nr. 1 hoffentlich verdeutlicht.
Wenn du die erste Zeile auskommentierst, also ein Semikolon davorsetzt, und das Kommentarzeichen vor der 2. Zeile entfernst, wird n mit 5 initialisiert und das Array geht von 0 bis 5. Es hat dann die Elemente 0, 1, 2, 3, 4 und 5 - also 6 Stück insgesamt. (Achtung: Unterschied zu anderen Programmiersprachen!)
Standardmäßig überprüft FreeBASIC nicht, ob ein Array-Element, auf das man zugreifen möchte, auch tatsächlich existiert. Der Zugriff wird einfach durchgeführt. D.h. man kann auch bei einem Array, das nur von 0 bis 5 geht und damit 6 Elemente hat, versuchen, auf das Element Nr. 100 zuzugreifen. Das ist compilierbar. Allerdings stehen die Chancen sehr gut, dass das Programm dadurch abstürzt. ...weil man auf Speicher zugreift, auf dem man nichts zu suchen hat.
Um solche Fehler zu vermeiden, sollte man LBound und UBound benutzen. Die beiden Funktionen ermitteln automatisch die untere und obere Grenze eines Arrays. In Zählschleifen (FOR) usw. sollte man daher stets LBound und UBound benutzen, statt feste Zahlwerte einzugeben. So wird sichergestellt, dass nur auf Elemente zugegriffen wird, die tatsächlich vorhanden sind.
Stellt sich die Frage, warum auch falsche Programme teilweise ein bisschen laufen. Das folgende Programm sollte da für Erhellung sorgen.
Code: | dim as integer werte(0 to 2)
werte(0) = 42
werte(1) = 123
werte(2) = 456
Print "TIPP: Das Programm kann mit ESCape abgebrochen werden."
Print
dim i as integer
i = 0
do
Print "Gebe den " & i & ". Wert des Arrays aus: ";
print werte(i)
sleep 500
if (i = UBound(werte)) Then 'Hat der Index gerade die obere Grenze des Arrays erreicht?
Print
Print String(80,"*");
Print "Ab jetzt ist das Array eigentlich zu Ende! Der Speicher des PCs aber natuerlich"
Print "nicht. Der geht noch viele Megabytes weiter, aber was da ab jetzt drinsteht,"
Print "gehoert nicht mehr zu unserem Array! Wenn wir in den fremden Speicher da"
Print "schreiben, wird unser Programm frueher oder spaeter abstuerzen."
Print "Genau das werden wir jetzt machen. Wir lesen jeweils den Wert aus, der im"
Print "Speicher steht, und ueberschreiben ihn anschliessend mit 0. *muahaha*"
Print "Mal sehen, wie lange das gutgeht..."
Print "Drueck eine Taste, dann geht's weiter."
Print String(80,"*")
Sleep
End If
werte(i) = 0 '<-- Speicherstelle mit 0 ueberschreiben
i += 1 'i um eins erhöhen -> zur naechsten Speicherstelle gehen
loop until inkey = chr(27) |
Ausgeführt und abgestürzt sieht das dann z.B. so aus:
Bild zum Vergrößern anklicken.
Des Weiteren kann man FreeBASIC auch per Kommandozeilenoption anweisen, dass es die Array-Grenzen überprüfen soll. Das Programm stürzt dann zwar auch noch ab, aber nicht mehr mit Speicherzugriffsfehler des OS, wie man ihn auf dem Screenshot sieht.
Viele Grüße!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Zuletzt bearbeitet von Sebastian am 27.11.2011, 00:29, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 26.11.2011, 21:05 Titel: |
|
|
freebasic ist nicht matlab. Du kannst nicht einfach sagen "a ist ein array" und dann legen sich die einträge einfach von selbst an wenn du sie benutzt. Das array hat eine bestimmte größe die du festlegst in dem moment wo du's erstellst. Das ist bei dir die zweite zeile im programm, du benutzt n als größe, das hat den wert 0, also ist dein array 0 einträge groß (bzw in freebasic heißt das glaub ich "der höchste eintrag ist 0", also ists einen eintrag groß) und das programm stürzt ab wenn du plätze 1 und 2 zu benutzen versuchst weils die eben nicht gibt. _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 26.11.2011, 21:39 Titel: |
|
|
Willst du ein Array mitwachsen lassen, dann brauchst du REDIM. |
|
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.
|
|