Hallo
das ist mein erster Artikel auf Wer-Weiss-Was und gleich habe ich ein Problem. Ich versuche es mal zu schildern:
Mein Programm ist ein Vokabeltrainer. Es liest Vokabeln aus einer CSV-Datei ein und fragt diese dann ab. Der User muss die korrekte Übersetzung eingeben und dann gibt’s die nächste Vokabel. So weit, so gut. Jetzt sind aber irgendwann mal keine Vokabeln mehr im Array und das Programm soll auslaufen oder halt was anderes machen. Nun kommt es aber wohl gelegendlich vor, dass a welchem Grundauch immer eine Endlosschleife entsteht und sich wärend der Ausführung der ganze Rechner aufhängt. Ich mache mal folgendes:
Ich poste jetzt mal meinen Quellcode hier rein und dann wär ich sowas von glücklich, wenn jemand von euch meinen logischen Fehler finden würde. Ach nochwas: Entschuldigt mangelnde Einrückungen. Ich bin nämlich blind, arbeite zur Zeit am Computer mit einer Sprachausgabe, die liest dn Bildschirminhalt vor, und damit ist es schwierig, beim proggen auf Einrückungenzu achten. Also hier mal der Quellcode, ich glaube der Fehler liegt in der cmdWeiter:
Option Explicit
' Der deklarationsteil
' Funktion zur Soundwiedergabe
Private Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" \_
(ByVal lpszName As String, ByVal hModule As Long, \_
ByVal dwFlags As Long) As Long
Public play As Variant
Public SoundNumber As Integer
' Die Anzahl von Vokabeln im Array
Public anzVocabeln As Variant
' Einzelne Vokabel aus dem Array
Public vocabel As Variant
' Variablen für den Punktestand
Public scorePos As Integer
Public scoreNeg As Integer
' Das Vokabelarray und das Hilfsarray für die Prüfung, ob die Vokabel schon mal abgefragt wurde
Dim myArray() As String
Dim myHelpArray() As String
' Die Zufallszahl für die Vokabelauswahl
Dim randomvalue As Integer
' Die Ober- und Untergrenzen des Vokabelarrays
Dim upperbound As Integer
Dim lowerbound As Integer
' Aktionen für das Drücken des beenden Schalters festlegen
Private Sub cmdBeenden\_Click()
' Zufallsgenerator inizialisieren
Randomize
' Verabschiedungsdatei abspielen
SoundNumber = CInt(Int((3 - 1 + 1) \* Rnd() + 1))
play = PlaySound(App.Path & "\sounds\tschoe" & SoundNumber & ".wav", 0, 0)
' Programm beenden
Unload Me
End Sub
'Aktionen für den Fall festlegen, dass der User
' eine Datei gewählt hat, die Anzahl von abzufragenden Vokabeln angegeben hat
' und auf den Startknopf gedrückt hat.
Private Sub cmdStarten\_Click()
' Prüfen, ob eine Datei angegeben wurde
If tbxDatei.Text = "" Then
' Zufallsgenerator anwerfen
Randomize
' Fehlerdatei abspielen
SoundNumber = CInt(Int((3 - 1 + 1) \* Rnd() + 1))
play = PlaySound(App.Path & "\sounds\keinedatei" & SoundNumber & ".wav", 0, 1)
MsgBox "Keine oder ungültige Datei angegeben!"
Else
If tbxAnzVocabeln.Text = "" Then
' Zufallsgenerator anwerfen
Randomize
' Fehlerdatei abspielen
SoundNumber = CInt(Int((3 - 1 + 1) \* Rnd() + 1))
play = PlaySound(App.Path & "\sounds\keineanzahl" & SoundNumber & ".wav", 0, 1)
MsgBox "Gib erst an, wieviele Vokabeln du abgefragt werden möchtest"
Else
' wenn der Weiter-Schalter nicht mehr verfügbar ist, soll er wieder anwählbar sein
If cmdWeiter.Enabled = False Then
cmdWeiter.Enabled = True
End If
' Den Richtig-Falsch-Zähler nullen
scoreNeg = 0
scorePos = 0
' Setzt die Untergrenze der Arrays auf 0
lowerbound = 0
' Holt sich die gewünschte Anzahl von Vokabeln aus dem Eingabefeld
anzVocabeln = tbxAnzVocabeln.Text
' Jetzt wird die Vokabeldatei geladen und in ein 2dimensionales Array umgewandelt
Dim f As Integer
Dim TextZeile As String
Dim mytmpArray() As String
Dim Rows As Long
Dim Fields As Integer
Dim tmpString() As String
Dim i As Long
Dim j As Long
Dim k As Long
f = FreeFile
' Holt sich den Dateinamen aus dem Eingabefeld und öffnet die Datei
Open tbxDatei.Text For Input As f
' Arbeitet so lange das Ende der Datei noch nicht erreicht wurde
Do While Not EOF(f)
' Speichert die aktuelle Zeile
Line Input #f, TextZeile
' fügt dem Arraykonstrukt eine Zeile hinzu
Rows = Rows + 1
Loop
Close f
Fields = 1
ReDim myArray(Rows, Fields)
f = FreeFile
Open tbxDatei.Text For Input As f
Do While Not EOF(f)
Line Input #f, TextZeile
mytmpArray() = Split(TextZeile, "=", , vbTextCompare)
i = UBound(mytmpArray())
For j = 0 To i
myArray(k, j) = mytmpArray(j)
Next j
k = k + 1
Loop
Close f
' Prüfen, ob der User nicht mehr Vokabeln gefragt werden will, als in der Datei vorhanden sind
If anzVocabeln 0 Then
' Hier laden wir nochmal unseren Zufallsgenerator
' Es soll später zufällig eine Sounddatei abgespielt werden
' Je nach dem, ob die Vokabel richtig war oder nicht
Randomize
'Jetzt prüfen wir, ob der User die Richtige Übersätzung eingegeben hat
If tbxFranzoesisch.Text = myArray(vocabel, 1) Then
' Wir zählen die Variable für richtige Vokabeln hoch,
' geben einen entsprechenden Sound aus
' und Zeigen den neuen Zählerstand am Bildschirm an
scorePos = scorePos + 1
SoundNumber = CInt(Int((3 - 1 + 1) \* Rnd() + 1))
play = PlaySound(App.Path & "\sounds\richtig" & SoundNumber & ".wav", 0, 1)
MsgBox "richtig!"
tbxScorePos.Text = scorePos
' In diesen Zweig gehen wir, wenn die Übersätzung falsch war,
' Der Zähler für falsche Vokabeln wird hochgezählt und ein entsprechender Sound ausgegeben,
' Das Ergebnis wird sofort am Bildschirm angezeigt.
Else
scoreNeg = scoreNeg + 1
SoundNumber = CInt(Int((3 - 1 + 1) \* Rnd() + 1))
play = PlaySound(App.Path & "\sounds\falsch" & SoundNumber & ".wav", 0, 1)
MsgBox "leider Falsch" & vbCrLf & "Richtig wäre gewesen: " & myArray(vocabel, 1)
tbxScoreNeg.Text = scoreNeg
End If
' Jetzt suchen wir nach einer neuen Vokabel zum abfragen
Do
' Zufallsgenerator laden, neue Vokabel an hand der Zufallszahl aussuchen
Randomize
randomvalue = CInt(Int((upperbound - lowerbound + 1) \* Rnd() + lowerbound))
vocabel = randomvalue
' Die neue Vokabel anzeigen
tbxDeutsch.Text = myArray(vocabel, 0)
' Das Übersätzungseingabefeld leeren
tbxFranzoesisch.Text = ""
' Jetzt kommt der Schleifenfuß
' Die schleife soll laufen,
' bis die ermittelte Vokabel im Hilfsarray nicht als bereits benutzt markiert festgestellt wurde,
' und bis überhaupt eine Vokabel ermittelt wurde.
Loop Until myHelpArray(vocabel, 1) "set" And myHelpArray(vocabel, 0) "" Or anzVocabeln
Wie gesagt liest das Programm csv-Datein ein, die das = als Trennzeichen verwenden.
die csv sieht ungefähr so aus:
Tisch=table
Möbel=furniture
Augenbraue=eyebrow
So, das wars. Bitte helft mir, das Programm wird ein Geschenk für meine Freundin.
Gruß
Tschapajew
[MOD] - Pre-Tag eingefügt