Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

06.02.2018, 22:52

Problem bei Quellcode mit Arrays und Strukturen

Hallo zusammen,

ich habe mich heute mal hingesetzt und versucht eine kleine Konsolenanwendung mit Arrays und Strukturen zu schreiben. (Visual Studio 2017)
Es soll eine Art Spiel werden, bei dem man auf einem Spielfeld (aus einem 2 dimensionalem Array) Felder markieren und benennen kann. Es basiert allerdings erstmal nur auf den ersten 2 Menüpunkten
Allerdings funktioniert das Programm nicht richtig (Es ist auch noch nicht ganz fertig, denn ich kann ohne die Behebung dieses Fehlers nicht weiter arbeiten.) und da ich schon seit 2 Stunden daran sitze den Fehler zu finden :dash: , dachte ich, ich frage mal in dem Forum hier nach.
Vielleicht kann mich hier ja jemand mit geschulterem Auge auf meinen Fehler aufmerksam machen. Das hier ist der Quellcode:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include "stdafx.h"
#include <iostream>

using namespace std;

//Funktionsprototypen


//Hauptfunktion
int main()
{
    //Konstanten

    const int Höhe = 6;
    const int Breite = 6;
    //Erstellen von Strukturen

    struct S_Feldangaben
    {
        int Wert;
        bool Besetzt;
        char Name[10];
    };

    //andere Variablen
    int Menü = 0;
    int Zähler = 0;
    int x, y;
    int Test[2];
    int Schalter = 0;
    S_Feldangaben Feld[Höhe][Breite];

    do
    {
        cout << "Waehle den Menuepunkt.\n---------------------- " << endl;
        cout << "\n\n(1) Spielfeld anzeigen, " << endl << "(2) Feld besetzen, " << endl <<  "(3) Felddaten anzeigen, " << endl << "(4) Spielfeld loeschen, " << endl << "(5) Beenden " << endl;
        cin >> Menü;

        if (Schalter == 0);
        {//Das Feld wird erstellt
            for (y = 0; y < Höhe; y++)
            {
                for (x = 0; x < Breite; x++)
                {
                    Feld[x][y].Wert = Zähler;
                    Zähler++;
                }
            }
            Schalter = 1;
        }

        // Falls Menüpunkt 1 gedrückt wird
        if (Menü == 1)
        {
            cout << "Das hier ist das Spielfeld: " << endl;
            for (y = 0; y < Höhe; y++)
            {
                for (x = 0; x < Breite; x++)
                {
                    if (Feld[x][y].Besetzt == true)
                        cout << "X ";
                    else
                        cout << ". ";
                }
                cout << endl;
            }
            cout << "\n\n\n";
        }

        // Falls Menüpunkt 2 gedrückt wird
        if (Menü == 2)
        {
            cout << "Hier kannst du Felder im Spielfeld besetzen und ihnen einen Namen geben. " << endl;
            cout << "Gib einfach die Koordinaten deines Wunschfeldes ein." << endl;
            cout << "Zuerst die x-Koordinate und dann die y-Koordinate. " << endl;
            cin >> x;
            cout << "Und jetzt die y-Koordinate. " << endl;
            cin >> y;

            cout << "Wie soll das Feld genannt werden? " << endl;
            cin.get (Feld[x][y].Name, 9);

            Feld[x][y].Besetzt = true;
        }


    } while (Menü >=1 && Menü <= 4);

    return 0;
}


Ich weiß auf jeden Fall, dass es etwas mit dem "cin.get" relativ am Ende zu tun hat, da ab dann das Programm immer abbricht. Ich weiß allerdings nicht genau, was ich falsch gemacht habe. ?(
Ich bin für jede Hilfe dankbar und hoffe, dass man mir hier weiterhelfen kann :)
»kuchen499« hat folgende Datei angehängt:

2

07.02.2018, 06:55

Erstmal willkommen im Forum :)

Probier mal mit dem Debugger herauszufinden, was nicht passt. Einfach nach jedem Befehl ab dem cin.get().

Edit: Fehlinformationen entfernt
Albert Einstein sagte: "2 Stunden mit einem netten Mädchen fühlen sich an wie 20 Minuten, 20 Minuten auf einem heißen Ofen fühlen sich an wie 2 Stunden. - Das ist Relativität"

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Patrick Z.« (07.02.2018, 07:13)


David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

07.02.2018, 06:58

Hallo und Willkommen im Forum!

1.) Du deklarierst dein Array so: Feld[Höhe][Breite], greifst aber später überall mit [x][y] darauf zu. Richtig wäre [y][x] oder als Feld[Breite][Höhe] deklarieren. Aber in deinem Fall hast du Glück, da Breite und Höhe gleich sind. Für später würde ich es aber auf jeden Fall korrigieren.

2.) Du prüfst nach der Eingabe von x und y nicht, ob sie im gültigen Bereich liegen, d. h. >= 0 und < Breite bzw. < Höhe.

3.) Du prüfst auch nicht, ob überhaupt eine gültige Zahl eingegeben wurde und nicht einfach gar nichts oder etwas wie "hjkadahkdhsajda". Siehe z. B.: https://stackoverflow.com/questions/1856…-for-an-integer

4.) Du hast nicht richtig beschrieben, was der eigentliche Fehler ist. Stürzt das Programm ab? Beendet es sich "normal"? Bei welcher Eingabe passiert das?

4

07.02.2018, 15:05

Danke erstmal für die Antworten :)

Ich bin den Tipps mal nachgegangen und habe den Code folgendermaßen verändert:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include "stdafx.h"
#include <iostream>

using namespace std;

//Funktionsprototypen


//Hauptfunktion
int main()
{
    //Konstanten

    const int Höhe = 6;
    const int Breite = 6;
    //Erstellen von Strukturen

    struct S_Feldangaben
    {
        int Wert;
        bool Besetzt;
        char Name[10];
    };

    //andere Variablen
    int Menü = 0;
    int Zähler = 0;
    int x, y;
    int Test[2];
    int Schalter = 0;
    S_Feldangaben Feld[Breite][Höhe];

    do
    {
        cout << "Waehle den Menuepunkt.\n---------------------- " << endl;
        cout << "\n\n(1) Spielfeld anzeigen, " << endl << "(2) Feld besetzen, " << endl <<  "(3) Felddaten anzeigen, " << endl << "(4) Spielfeld loeschen, " << endl << "(5) Beenden " << endl;
        cin >> Menü;

        if (Schalter == 0);
        {//Das Feld wird erstellt
            for (y = 0; y < Höhe; y++)
            {
                for (x = 0; x < Breite; x++)
                {
                    Feld[x][y].Wert = Zähler;
                    Zähler++;
                }
            }
            Schalter = 1;
        }

        // Falls Menüpunkt 1 gedrückt wird
        if (Menü == 1)
        {
            cout << "Das hier ist das Spielfeld: " << endl;
            for (y = 0; y < Höhe; y++)
            {
                for (x = 0; x < Breite; x++)
                {
                    if (Feld[x][y].Besetzt == true)
                        cout << "X ";
                    else
                        cout << ". ";
                }
                cout << endl;
            }
            cout << "\n\n\n";
        }

        // Falls Menüpunkt 2 gedrückt wird
        if (Menü == 2)
        {
            do
            {
                cout << "Hier kannst du Felder im Spielfeld besetzen und ihnen einen Namen geben. " << endl;
                cout << "Gib einfach die Koordinaten deines Wunschfeldes ein." << endl;
                cout << "Zuerst die x-Koordinate und dann die y-Koordinate. " << endl;
                cin >> x;
                cout << "Und jetzt die y-Koordinate. " << endl;
                cin >> y;
            } while (x < 0 || x >= Breite || y < 0 || y >= Höhe);

            cout << "Wie soll das Feld genannt werden? " << endl;
                        cin.get (Feld[x][y].Name, 9);

            Feld[x][y].Besetzt = true;
        }


    } while (Menü >=1 && Menü <= 4);

    return 0;
}


Funktionieren tut es aber immer noch nicht. Ich versuche mal den Fehler zu erklären.
Wenn ich das Programm starte und Menüpunkt 1 aufrufe, funktioniert erstmal alles wie gewollt und das Feld wird ausgegeben.
Wenn ich jetzt allerdings Menüpunkt 2 aufrufe und die x- und y-Werte eingebe, dann hängt sich das Programm auf und gibt mir ununterbrochen die do-Schleife am Ende aus und fordert mich auf, die x-/y-Koordinaten einzugeben(Auch wenn die Bedingungen gar nicht erfüllt sind). Ohne diese do-Schleife (so wie am Anfang) Hat mir das Programm dauerhaft das Hauptmenü ausgegeben und mich aufgefordert, den Menüpunkt auszuwählen.
Im Anhang befinden sich Bilder davon, was mir die Konsole ausgibt. Ich weiß, dass es an dem cin.get Befehl am Ende liegt, da ohne ihn das Programm funktioniert(Natürlich kann man dafür keine Felder benennen.)
Ich hoffe ich konnte das Problem einigermaßen beschreiben.
»kuchen499« hat folgende Bilder angehängt:
  • mit do-Schleife.png
  • ohne do-Schleife.png

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

07.02.2018, 20:06

Vielen Dank!
Nachdem ich vor die cin.get Funktion ein cin.ignore(); gestellt habe, hat es geklappt.
:D

Werbeanzeige