Goto mit Variable

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von Elephant.

    Goto mit Variable

    Hallo,
    ich versuche eine VB Konsolenanwendung schreiben in der ich die Befehle in einer externen Microsoft Access Datenbank speichere. Mir ist bewusst, dass die Goto Funktion nicht die beste Möglichkeit ist, aber es ist in meinem Fall die Praktischste Variante.

    Nun meine Frage:
    Die Befehle werden in der Datenbank mit einem goto bezeichner hinterlegt. Wenn die Datenbank ausgelesen wird, wird dieser Bezeichner ausgelesen und das Programm soll dann dahin gehen.
    Als Beispiel:

    VB.NET-Quellcode

    1. 'vereinfachtes Auslesen der Datenbank mit Goto Anweisung
    2. Dim a as string = "punkt"
    3. goto a
    4. punkt:
    5. 'code...


    Vielen Dank

    Thema verschoben; Das Thema wird automatisch dort erstellt, wo man sich befindet, wenn man auf [* Neues Thema] klickt. ~VaporiZed

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    GOTO erwartet ein Label.
    Keine Variable.

    Außerdem ist GOTO ein Relikt aus der Spaghetti-Programmierung.
    Verwende statt dessen einen vernünftigen Workflow.
    Wenn du den gesamten Code veröffentlichst, können wird dir vielleicht auf die Sprünge helfen, wie man so etwas richtig macht.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Willkommen im Forum.

    Schreib mal bitte etwas ausführlicher, wie Du Dein Problem mit mehreren GoTo-Anweisungen lösen würdest, auch wenn schon gesagt wurde, dass das nicht geht. Aber dann können wir uns ein Bild machen, in welche Richtung Deine Denkweise geht. Ich denke, es geht in Richtung Select Case.

    VB.NET-Quellcode

    1. Dim Datenbankeintrag As String
    2. '…
    3. Select Case Datenbankeintrag
    4. Case "User": LadeUserAusDatenbank
    5. Case "Bikes": LadeFahrraederAusDatenbank
    6. Case Else: Throw New ArgumentException($"Die Tabelle {Datenbankeintrag} ist unbekannt.")
    7. End Select
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Erst einmal vielen Dank für die viele Hilfe.
    Ich befinde mich noch ganz am Anfang des Programmes und versuche erst einmal eine Grundlage zu schreiben.
    Im folgenden befindet sich das was bisher entstanden ist mit zwei Beispielen.

    VB.NET-Quellcode

    1. Module console
    2. Dim input As Primitive
    3. Sub Main()
    4. System.Console.Title = "Console"
    5. cmd:
    6. System.Console.WriteLine("Befehl eingeben")
    7. input = TextWindow.Read()
    8. If input = CType("sound1", Primitive) Then
    9. GoTo sound1
    10. ElseIf input = CType("end", Primitive) Then
    11. GoTo cend
    12. Else
    13. GoTo Err
    14. End If
    15. 'new cmd here
    16. sound1:
    17. My.Computer.Audio.Play("audio/1.wav", AudioPlayMode.WaitToComplete)
    18. GoTo cmd
    19. Err:
    20. System.Console.WriteLine("Befehl nicht gefunden!")
    21. GoTo cmd
    22. cend:
    23. End
    24. End Sub
    25. End Module


    Das wäre ein Beispiel für den Grundaufbau. Meine Idee war eben, den Grundaufbau an dieser Stelle zu verändern, um das hinzufügen neuer Befehle zu vereinfachen und die Übersichtlichkeit zu erhöhen und ebendiese Befehle in einer Ms Access db zu speichern. Bis jetzt wäre eben im oberen Teil die Abfrage des eingegebenen Befehls und im unteren Teil Stehen die Befehle. Alles (mit Befehlen) in eine große If Anweisung zu packen ist für mich nicht so richtig eine Möglichkeit.
    Ich hatte letztens eine Situation wo ich auch hin und her springen musste..hatte des zuerst mit GoTo gelöst..fand des aber sehr unglücklich..
    ..danach hab ich die Abfragen in eine While-Schleife gepackt..fand ich besser!

    Geht das?:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. ​Imports System.Console
    2. Module console
    3. Private input As String
    4. Private audioFile As String = "-soundFile-.wav"
    5. Sub Main()
    6. Title = "Console"
    7. WriteLine("Befehl eingeben")
    8. input = ReadLine()
    9. If input = "sound1" Then
    10. PlaySound(audioFile, AudioPlayMode.WaitToComplete)
    11. Main()
    12. ElseIf input = "end" Then
    13. Exit Sub
    14. Else
    15. WriteLine("Befehl nicht gefunden!")
    16. Main()
    17. End If
    18. End Sub
    19. Private Sub PlaySound(audioFile As String, PlayMode As AudioPlayMode)
    20. My.Computer.Audio.Play(audioFile, PlayMode)
    21. End Sub
    22. End Module

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Morrison“ ()

    @Haken So was ohne GoTo:

    VB.NET-Quellcode

    1. Module console
    2. Dim input As Primitive
    3. Sub Main()
    4. System.Console.Title = "Console"
    5. Do
    6. System.Console.WriteLine("Befehl eingeben")
    7. input = TextWindow.Read()
    8. If input = CType("sound1", Primitive) Then
    9. My.Computer.Audio.Play("audio/1.wav", AudioPlayMode.WaitToComplete)
    10. ElseIf input = CType("end", Primitive) Then
    11. Exit Do
    12. Else
    13. System.Console.WriteLine("Befehl nicht gefunden!")
    14. End If
    15. Loop
    16. End
    17. End Sub
    18. End Module
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich sehe mich wenn ich es so wie in dem Beispiel schreibe nur vor das Problem gestellt, wenn der code dann größer wird und nicht nur ein Audio.play enthält, dass ich die Übersicht verliere.
    Trotzem Danke.

    Haken schrieb:

    wenn der code dann größer wird und nicht nur ein Audio.play enthält
    kannst Du das noch wesentlich eleganter machen, indem Du alle Plays in eine Prozedur auslagerst.
    Du denkst leider in Spagetti-Code.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Was is'n Primitive, dass der Code CType("sound1", Primitive) Sinn ergibt?
    Auf End sollte man verzichten. Wenn man in der Sub Main ist, einfach stattdessen Return, wenn es nicht eh schon die letzte Zeile ist. Dann braucht man gar nix an Beendigungscode.

    Auf Dauer ist es m.E. immer sinnvoll, in einer Methode entweder Aufrufe anderer Methode oder "Arbeitscode" zu haben. Nicht beides. Oder nur, wenn nötig. Sonst blickt man ab einer bestimmte Größe gar nicht mehr durch.

    Elephant schrieb:

    Habe bisher wenn ich bei der Entwicklung mal will das ein bestimmterTeil nicht ausgeführt wird
    ein If 1=2 Then davor und ein end if dahinter geschrieben.
    Kann ich jetzt ja mit goto w und w: machen.
    Muß ich weniger tippen.

    Das ist IMHO ein Schritt in die falsche Richtung. Wie wär's stattdessen mit markieren und dem Auswahl auskommentieren-Button?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    VaporiZed schrieb:

    Das ist IMHO ein Schritt in die falsche Richtung. Wie wär's stattdessen mit markieren und dem Auswahl auskommentieren-Button?


    Wird in den meisten Fällen wohl besser sein.
    War mir bisher nicht aufgefallen, dass es die Möglichkeit gibt.
    Bräuchte eh mal ein Buch, was mir mal die ganze Entwicklungsumgebung erklärt.
    Wer eins kennt bitte mal schreiben.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Elephant“ ()

    Ich glaub, da wär aber ein Buch nur über VB.NET besser als eines über die ganze Entwicklungsumgebung (Visual Studio). Auch wenn ich keines habe. Oder eben das Forum. Ggf. einfach Code posten und sagen: »Wie würdet Ihr das machen?«
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.