Der Index war außerhalb des Arraybereichs. Was tun?

  • C#

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Der Index war außerhalb des Arraybereichs. Was tun?

    Guten Tag :)
    Ich lerne nun seit vielleicht 2 Monaten C# in der Schule und bin deshalb noch ziemlich schlecht.
    Ich will einen "Einarmigen Banditen" erstellen, d.h.: eine Slot Maschine!
    Dazu habe ich alles schon geschafft, bis auf die Währung.

    Ich habe sehr vieles Versucht und möchte mal sehen was hier für Vorschläge kommen.
    Ich habe bereits nach einer "Dynamischen Varbiablen" oder einer "Globalen Variablen" gesucht doch ohne Erfolg.
    Jetzt habe ich es mit einem Array probiert und kriege ständig die Fehlermeldung: "Der Index war außerhalb des Arraybereichs".
    Ich habe schon sehr viel im Internet darüber gelesen aber habe den genauen Fehler in meinem Code nicht gefunden.

    Mein Ziel?
    Die Eingabe des Benutzers (Wie viel er setzen will) soll er durch das Guthaben/Geld dividieren.
    Diese dividierte Zahl muss aber dann als Guthaben angezeigt werden.

    Mein Problem?
    Er nimmt immer wieder die 100 "coins" von meinem Geld wenn ich auf den Button drücke und dividiert die Einabe des Benutzers durch die 100 "coins" und nicht von dem restlichen Guthaben.

    Meine Lösung?
    Bisher noch keine, habe vieles versucht und denke, dass ich bei Arrays auf der richtigen Seite bin.

    (Das unten rot markierte hat er als Fehler genommen)
    Danke für jeden Vorschlag / Jede Hilfe! ^^

    namespace CS_Slots_Gamble
    {
    public partial class Form1 : Form
    {
    public Form1()
    {
    InitializeComponent();
    }


    private void button1_Click(object sender, EventArgs e)
    {
    int ENDLOS = int.MaxValue;
    int[] Geld = new int[101];
    Geld[0] = 100;
    int Einsatz = int.Parse(textBox1.Text);
    string Währung = "coins";
    string GuthabenNachGambling = Geld[0] + " " + Währung;
    label1.Text = "Guthaben:" + " " + GuthabenNachGambling;

    for (int i = 1; i < ENDLOS; i++)
    {

    if (Geld[0] - Einsatz >= 0 && sender == button1)
    {
    Geld[0] = Geld[0] - Einsatz;
    GuthabenNachGambling = Geld[(i)] + " " + Währung;
    label1.Text = "Guthaben:" + " " + GuthabenNachGambling;
    Random rnd = new Random(); // erstellt einen Zufallsgenerator (rnd)
    int z1 = rnd.Next(1, 8); // erzeugt eine Zufallszahl z1 mit 1 <= z1 < 8
    int z2 = rnd.Next(1, 8);
    int z3 = rnd.Next(1, 8);
    if (z1 == z2 |"| z2 == z3 |"| z1 == z3)
    {
    Geld = Geld[i] + Einsatz + Einsatz;
    GuthabenNachGambling = Geld[i] + " " + Währung;
    label1.Text = "Guthaben:" + " " + GuthabenNachGambling;
    }
    GuthabenNachGambling = Geld[i] + " " + Währung;
    label1.Text = "Guthaben:" + " " + GuthabenNachGambling;
    }

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Angelo“ ()

    Durch Geld[i] versuchst du bei zweiten Schleifendurchlauf auf einen Index zuzugreifen der nicht existiert. Das Array Geld besitzt ja nur ein Element.

    *Edit*
    Du musst bei einer Varibalen zuweisung für ein Element im Array Geld den Index angeben Geld[0] = Geld[0] - Einsatz;
    *unnötiges Vollzitat entfernt*

    Also ich will halt, dass das Array [1] dann der Betrag mit dem Geld - Einsatz ist und wenn ich das auf Geld [0] mache ist es halt danach beim Anfang des Codes doch wieder bei 100 coins oder?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Richtig, weil du die Variablen in der Methode erstellst. Das heißt, sie werden bei jedem Click auf den Button neu erstellt, neu zugewiesen usw. Folglich werden deine Werte vor jedem Durchlauf sozusagen "zurückgesetzt". Mal schauen ob du da selbst ne Lösung findest.

    Grüße
    Grüße
    Felix
    Es gibt viel zu tun. Und zwar nicht nur am Code.
    Zum Post selber:
    Bitte CodeTags verwenden, damit || nicht als Smiley, sondern als logisches Oder erkannt wird.
    Die Farbe Rot ist den Moderatoren vorbehalten. Bitte ändern, bevor es von denen einen Rüffel gibt.
    FullQuotes, v.a. von direkt vorangegangenen Posts blähen das Forum auf und sind laut Regeln zu unterlassen.

    Zum Code: Deine Endlosschleife kannst Du durch folgendes ersetzen:

    C#-Quellcode

    1. do
    2. {
    3. //your code
    4. }

    notfalls auch durch for (;;)
    Stellt sich gleich die Frage: Gibt's da auch irgendwo einen Ausgang aus Deiner Schleife? Außer nach ca. 4 Mrd. Durchläufen.

    Das Prinzip Deines Geldarrays ist mir immer noch nicht klar. Geld soll doch das sein, was man noch hat. Wozu nicht eine einfache Variable, sondern ein Array - was ja eh nicht klappt, da Du nur Geld[0] initialisierst, aber kein anderes - weshalb es ja auch zu Fehlern kommt.

    Wenn Du das mit dem Array beibehältst und das Problem gelöst hast, hast Du mit dem i in der For-Schleife spätestens ab dem 103. Durchlauf ein Problem. Da Dein Geld-Array nur 102 Einträge hat, kommt es zu einen Crash, wenn i zu hoch für Dein Array wird.

    Das Ganze dürfte doch gar nichts anzeigen, da das alles eine Scheinbar-Endlosschleife ohne Updaten der GUI ist. Was Du wohl vorhattest: Grundsätzlich 4 Mrd. Versuche ermöglichen (egal, wie sinnvoll das ist, wenn man kein Geld mehr hat). Aber da ist das Konstrukt falsch, da einmal die Schleife betreten es keinen sinnvollen Ausgang mehr gibt. Die GUI wird frosten.

    Es reicht, wenn Du einen Zufallsgenerator instanziierst. Bei jedem Schleifendurchgang wie bisher - das ist Overkill.

    Aus

    C#-Quellcode

    1. if (z1 == z2 || z2 == z3 || z1 == z3)
    2. {
    3. Geld = Geld[i] + Einsatz + Einsatz;
    4. GuthabenNachGambling = Geld[i] + " " + Währung;
    5. label1.Text = "Guthaben:" + " " + GuthabenNachGambling;
    6. }
    7. GuthabenNachGambling = Geld[i] + " " + Währung;
    8. label1.Text = "Guthaben:" + " " + GuthabenNachGambling;
    9. }

    kannst Du auch

    C#-Quellcode

    1. if (z1 == z2 || z2 == z3 || z1 == z3)
    2. {
    3. Geld[0] = Geld[0] + 2 * Einsatz;
    4. }
    5. GuthabenNachGambling = Geld[0] + " " + Währung;
    6. label1.Text = "Guthaben:" + " " + GuthabenNachGambling;
    7. }

    machen.
    Hach, da könnte man noch viel machen. Aber nicht alles auf einmal. Mühsam erhängt sich das Eichhörnchen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

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

    @Angelo Willkommen im Forum. :thumbup:
    Das Hauptproblem ist, dass Du Dich nicht überzeugt hast, was Dein Code eigentlich tut.
    Du schreibst da ein par Zeilen hin, C&P möglicherweise, und freust Dich, wenn es compiliert.
    Doch dann läuft es nicht so, wie Du Dir das vorgestellt hast.
    Fazit:
    Du musst Dich von jeder einzelnen Zeile Deines Codes überzeugen, dass sic das tut, was sie soll.
    Am besten, Du schreibst über jede Zeile einen entsprechenden Kommentar.
    Vergleiche den Inhalt der Variablen mit dem, was nach Deiner Vorstellung drin stehen soll.
    Du setzt einen Haltepunkt drauf und debuggst Deinen Code: Debuggen, Fehler finden und beseitigen
    Wenn Du eine Zeile gefunden hast, wo der Variableninhalt nicht Deinen Vorstellungen entspricht, hast Du einen Fehler gefunden. :thumbsup:
    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).
    VB-Fragen über PN / Konversation werden ignoriert!

    Kenaex schrieb:

    Richtig, weil du die Variablen in der Methode erstellst. Das heißt, sie werden bei jedem Click auf den Button neu erstellt, neu zugewiesen usw. Folglich werden deine Werte vor jedem Durchlauf sozusagen "zurückgesetzt". Mal schauen ob du da selbst ne Lösung findest.

    Grüße


    Das ist mir bewusst, aber ich weiß nicht wie ich das anders machen kann, habe es versucht bei Forms1 hinzuschreiben damit das nicht nur beim Button Click passiert, sondern durchgehend so ist, doch dann kann ich die Variable Geld nicht mehr in dem Button1 benutzen weil sie dort nicht existiert.

    ​Zum Code: Deine Endlosschleife kannst Du durch folgendes ersetzen:


    Soll ich vor das vor der Variablen Geld machen? Bis ganz unten durch?
    @Angelo Poste mal das bereinigte Projekt (ohne Binaries) als ZIP.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    1. über [Erweiterte Antwort] kannst Du foreninterne Uploads machen. Externe Hoster sind nicht gern gesehen.
    2. Nachdem ich langsam durchstieg, wurde mir klar, dass Du überhaupt keine Schleife brauchst.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Und inwiefern "existieren" die Variablen in der Methode nicht? Ich blick nicht durch, was du meinst. Ich versteh außerdem nicht, wieso du eine Schleife und ein Array benutzen möchtest.
    Du möchtest deinen Vorgang ja nur einmal ausführen und du brauchst auch nur einen Wert, um den Geldbetrag zu speichern.

    Grüße
    Grüße
    Felix
    Entferne die Do-Schleife und pack die Zeilen

    C#-Quellcode

    1. Random rnd = new Random(); // erstellt einen Zufallsgenerator (rnd)
    2. int Geld = 100;

    direkt vor die Zeilen

    C#-Quellcode

    1. public Form1()
    2. {
    3. InitializeComponent();
    4. }


    Begründung:
    Eine Endlosschleife, die bei einem Button_Click ausgeführt wird, ergibt keinen Sinn.
    Es reicht eine einzige Randominstanz. Sie immer neu zu erstellen hat keinen Vorteil, sondern verlangsamt Dein Programm.
    Das Geld wird nur zum Programmstart auf 100 festgelegt. Und nicht bei jedem GO!-Klick auf 100 zurückgesetzt. Wenn Du das doch so beibehalten willst, mach ein Casino auf und ich bin Stammgast bei Dir ;)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    *unnötiges Vollzitat entfernt*

    Du weißt gar nicht WIE dankbar ich dir bin hahahaha bin echt nicht drauf gekommen und es klappt! :D
    Hatte es davor in die Form1() reingeschrieben aber das außerhalb zu schreiben, darauf bin ich nicht gekomen! Danke!
    Klar, du kriegst von mir direkt 5.000 coins Startguthaben ;)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    @Angelo Bitte beachte unsere Boardregeln zum Tema "Voll-Zitate" ("Full quotes").
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum

    Angelo schrieb:

    Weiß nicht was du mit ohne Binaries meinst
    So was:

    Und:
    Nutze die Dateianhangs-Funktionalität des Forums:
    Erweiterte Antwort => Dateianhänge => Hochladen
    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).
    VB-Fragen über PN / Konversation werden ignoriert!

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