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:

Variablen, Matrix: Fehlerbehebung

 
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
Powertower



Anmeldungsdatum: 30.03.2011
Beiträge: 8

BeitragVerfasst am: 26.11.2011, 18:59    Titel: Variablen, Matrix: Fehlerbehebung Antworten mit Zitat

Hallo alle zusammen lächeln ,
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 geschockt

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
Code:
a(1)="bello"

und
Code:
print a(1) , a(2)

nicht rein packe, der die beiden mit Blatt-Kreuz, zwei Leerzeichen und $ bzw. mit garnix belegt??? verwundert

vielen Dank, schon mal
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 26.11.2011, 19:01    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 30.03.2011
Beiträge: 8

BeitragVerfasst am: 26.11.2011, 19:07    Titel: Antworten mit Zitat

Code:
for n=1 to 5


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



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 26.11.2011, 19:18    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 30.03.2011
Beiträge: 8

BeitragVerfasst am: 26.11.2011, 19:31    Titel: Antworten mit Zitat

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... traurig

Edit: Ich könnte ja immer von 3 anfangen und die beiden immer umgehen, aber das ist doch nicht richtig so... neutral
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 26.11.2011, 20:05    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 30.03.2011
Beiträge: 8

BeitragVerfasst am: 26.11.2011, 20:16    Titel: Antworten mit Zitat

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


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 26.11.2011, 20:41    Titel: Antworten mit Zitat

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
Code:
dim as integer n

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. zwinkern ...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. zwinkern
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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 26.11.2011, 21:05    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 26.11.2011, 21:39    Titel: Antworten mit Zitat

Willst du ein Array mitwachsen lassen, dann brauchst du REDIM.
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