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

Errschaffer

Alter Hase

  • »Errschaffer« ist der Autor dieses Themas

Beiträge: 865

Wohnort: Frankfurt

  • Private Nachricht senden

1

03.07.2008, 16:06

Kapitel: Arrays Aufgabe

Hallo,
ich hänge gerade bei der Aufgabe in Kapitel Arrys fest.
Vieleicht bin auch nur zu doof dafür.

Das Hauptmenü steht und ich habe mir die erste Funktion geschrieben.
Bitte nicht darauf achten das noch Prototypen fehlen ich weiss, aber das tut ja nix zur sache.

Also die Fehelermeldung: 57 C:\Coding World\arrays\array.cpp `Besetzt' has not been declared

Quelltext:


C-/C++-Quelltext

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
#include <iostream>
using namespace std;

struct S_Feld
{
       bool Besetzt;
       char Name [50] ;
       };
       
       
   
//Konstanten

int const Breite=5;
int const Hoehe=5;
// Arrya des Spielfeldes

int Feld [Breite] [Hoehe];


// Prototypen

void Spielfeldanzeigen() ;

int main()
{
//Variabel zum Abfragen der gewünschten Tätigkeit

int Auswahl;

cout<<"1-Spielfeld anzeigen"<<endl;    
cout<<"2-Feld besetzen"<<endl;
cout<<"3-Felddaten anzeigen"<<endl;
cout<<"4-Spielfeld loeschen"<<endl;
cout<<"5-Progranmm beenden"<<endl;
cin>>Auswahl;
cout<<"Ihre Auswahl:"<<Auswahl<<endl;

switch (Auswahl)
{
       case ('1'):
            {
                   Spielfeldanzeigen ();
            } break;
            
            
                  
}


return 0;
}

void Spielfeldanzeigen ()
{
                for(int x=0; x<Hoehe;x++)
                {
                        for (int y=0; x<Breite;y++)
                        {
                        if (Feld [x][y].Besetzt==true)
                        cout<<x;
                        
                        else
                        cout<<.;               
                                     
                       
                        
                        }

                }
                            
                            
                

}
[/cpp]

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

03.07.2008, 16:10

Du schreibst:

std::cout << x;

und

std::cout << .;

Das geht nicht!
x müsste eine Variable sein, und das mit dem . geht schonmal gar nicht.
Richtig wäre:

std::cout << 'x';

und

std::cout << '.';

oder auch mit "x" / ".".
Und das "== true" kannst du dir sparen.

3

03.07.2008, 16:27

C-/C++-Quelltext

1
if (Feld [x][y].Besetzt==true)


dein "Feld" ist doch vom typ 'int'??

C-/C++-Quelltext

1
int Feld [Breite] [Hoehe]; 

sollte es denn nicht vom typ 'S_Feld' sein?

4

03.07.2008, 17:37

Du musst erst eine Instanz von deiner struktur in der main erstellen.

5

13.07.2008, 13:15

Einmal aufgeräumt:

C-/C++-Quelltext

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
#include <iostream> // std::cout, std::cin, std::cerr, std::ostream

#include <string> // std::string

#include <utility> // std::pair, std::make_pair

#include <algorithm> // std::copy

#include <iterator> // std::ostream_iterator


// Typ für Dimension (Breite u. Höhe) definieren

typedef std::pair<std::size_t, std::size_t> dimension_t;

// Konstante für Dimension des Spielfeld angeben

const dimension_t field_dimension(std::make_pair(5, 5));

// Struktur für Punkt auf dem Spielfeld anlegen

struct FieldEntry
{
    // Variablen

    bool used;
    std::string name;
    
    // Konstruktor

    FieldEntry()
        : used(false)
    {}

    // operator<<

    friend std::ostream& operator<<(std::ostream& out, FieldEntry const& data)
    { return out << used ? 'x' : '.'; }
};
       
// Array fürs Spielfeldes

FieldEntry field[field_dimension.first][field_dimension.second];

// Prototypen

void show_field();

int main()
{
    // Menü ausgeben

    std::cout << "(1) Spielfeld anzeigen\n"
              << "(2) Feld besetzen\n"
              << "(3) Felddaten anzeigen\n"
              << "(4) Spielfeld loeschen\n"
              << "(5) Progranmm beenden\n\n"
              << "Auswahl: ";

    // Auswahl abfragen

    unsigned short selection(0);
    std::cin >> selection;

    // Auf Auswahl reagieren

    switch (selection)
    {
    case 1:
        {
            show_field();
        } break;
    case 2:
    case 3:
    case 4:
    case 5:
        break;
        // Wenn ein ungültiger Wert ausgewählt wurde, Fehler melden.

    default:
        std::cerr << "FEHLER: Falsche Eingabe!" << std::endl;
    }
}

// Funktion zum Ausgeben des Spielfeldes

void show_field()
{
    // Jede Zeile durchgehen und ausgeben

    for (std::size_t i(0); i < field_dimension.first; ++i)
        std::copy(field[i], &field[i] + field_dimension.second, std::ostream_iterator<FieldEntry>(std::cout, ""));
}


Also nen Paar Anmerkungen zu deinem Code:
Zeile 6: Es ist nicht Festgelegt, welchen Ausgangswert Benutzt haben soll. Überlade einen Konstruktor für S_Feld.
(Anmerkung: Unter C++ sind class und struct nahezu identisch. Nur ist default-Zugriff bei class privat, bei struct public)
Zeile 7: Nimm hier lieber std::string, da er zum einen einfacher zu händeln ist und zum anderen auch eine beliebige Länge zulässt.
Zeile 13: Hier fehlt ein unsigned. Die Größe eines Arrays kann NIEMALS negativ sein, d.h. bietet sich hier ein unsigned an, um solche Fehler direkt zu vermeiden. Die beste Alternative wäre allerdings std::size_t, wobei dies meist einem unsigned int entspricht.
Zeile 16: Der Typ muss hier S_Feld sein.
Zeile 25: Warum legst du hier schon die Variable an? Generell gilt: Variable erst anlegen, wo sie gebraucht wird!
Zeile 33: Seine Eingabe sieht der Benutzer selbst, die musst du ihm nicht nochmal ausgeben!
Zeile 37: Hier muss ein "case 1:" stehen, denn du hast einen Integer eingelesen. std::cin wandelt dabei automatisch eine '1' in eine 1 um. Wenn du mit char einließt, wäre '1' korrekt.
Zeile 41: Du reagierst nicht auf falsche Eingaben.
Zeile 47: In main kann return 0 weggelassen, da der Standard festlegt, dass dies automatisch angenommen wird, wenn kein return gefunden wird. Dies gilt nur in main.
Zeile 52: Hier gilt auch: x kann und darf nicht negativ sein. D.h. unsigned int, noch besser std::size_t.
In dem Fall nicht wichtig ist der Unterscheid zwischen Post u. PreInkrementierung. Solltest du dir aber trotzdem mal angucken.
Zeile 54: Vgl. Zeile 52.
Zeile 56 - 63: Lassen sich durch den ternary operator vereinfachen:

C-/C++-Quelltext

1
std::cout << Feld[x][y].Besetzt ? 'x' : '.';

Du hast die von David genannten Fehler im Punkto 'x' und '.' drin.
Zeile 65: Hier fehlt ein std::cout << "\n"; um bei der Ausgabe auch eine neue Zeile zu beginnen!


Das war's soweit erstmal. Wenn du noch fragen hast, sag bescheid!
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Werbeanzeige