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

19.12.2008, 15:12

[Erledigt] Includieren Problem

Hallo,
nachdem nun das eine Porblem geklärt wurde konnte ich nun endlich weiter machen und habe den Spielzug für Spieler 1 fertig gemacht.
Wollte das dann in die Funktion bringen wo die Spielschleife ist um das mal zu testen. (mein komplemieren davor gab es keine Porbleme).

Also habe ich in die Klasse main die Klassen Player und Feld inculdiert da ich ja Funktionen aus beiden brauche. Ich hab erst mal die "Feld" hinzugefügt und die Funktion getestet die das Feld zeichnet (hat ja wunderbar geklappt).

Dann hab ich die Klasse "Player" eingefügt und ne Instanz erstellt. Und schon gibt es folgende Fehler. (nur Instanz erstellt, nichts anderes)

Zitat

ic-tac-toe mit klassen\header\feld.h(5) : error C2011: 'CFeld': 'class' Typneudefinition
1> d:\porgrammieren\c++\projekte\tic-tac-toe (mit klassen)\tic-tac-toe mit klassen\header\feld.h(5): Siehe Deklaration von 'CFeld'
1>d:\porgrammieren\c++\projekte\tic-tac-toe (mit klassen)\tic-tac-toe mit klassen\cpp\main.cpp(12) : error C2079: 'Field' verwendet undefiniertes class 'CFeld'
1>d:\porgrammieren\c++\projekte\tic-tac-toe (mit klassen)\tic-tac-toe mit klassen\cpp\main.cpp(74) : error C2228: Links von ".m_zeichnen_M" muss sich eine Klasse/Struktur/Union befinden.


Beim Aufrufen gibts dann noch mehr Fehler von wegen das in der Parameterliste die Sachen nicht erkannt werden.


Zitat

en\header\feld.h(5) : error C2011: 'CFeld': 'class' Typneudefinition
1> d:\porgrammieren\c++\projekte\tic-tac-toe (mit klassen)\tic-tac-toe mit klassen\header\feld.h(5): Siehe Deklaration von 'CFeld'
1>d:\porgrammieren\c++\projekte\tic-tac-toe (mit klassen)\tic-tac-toe mit klassen\cpp\main.cpp(12) : error C2079: 'Field' verwendet undefiniertes class 'CFeld'
1>d:\porgrammieren\c++\projekte\tic-tac-toe (mit klassen)\tic-tac-toe mit klassen\cpp\main.cpp(13) : error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'Play'
1>d:\porgrammieren\c++\projekte\tic-tac-toe (mit klassen)\tic-tac-toe mit klassen\cpp\main.cpp(13) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
1>d:\porgrammieren\c++\projekte\tic-tac-toe (mit klassen)\tic-tac-toe mit klassen\cpp\main.cpp(13) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
1>d:\porgrammieren\c++\projekte\tic-tac-toe (mit klassen)\tic-tac-toe mit klassen\cpp\main.cpp(75) : error C2228: Links von ".m_zeichnen_M" muss sich eine Klasse/Struktur/Union befinden.
1> Typ ist 'int'


Kann das vieleicht damit zusammen hängen da ich bereits in der Player.h die Feld.h includiert habe?
Aber wie kann man das umgehen? Oder liegt der Fehler ganz woanders?

Hier mal der Code wie ich die Funktuionen aufrufe.


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void Cmain::m_Schleife_M ()
{


//Spielfeldanlegen

Field.m_zeichnen_M ();
//Spieler 1 ist am Zug

Play.m_Spieler1_Zug (CFeld *o);
//Feld erneut zeichnen

Field.m_zeichnen_M ();

system ("pause");


}





Oder muss ich mich dafür erstmal mit Include Guards befassen. Sowas was ich hier mache ist doch Mehrfach-Inklusion oder?

Kann mir da bitte jemand helfen.

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

2

19.12.2008, 15:15

Suchworte: "Forward Declaration" und "Include Guard"

Ansonsten mal die Header posten, sonst können wir so recht nicht helfen ...

Errschaffer

Alter Hase

  • »Errschaffer« ist der Autor dieses Themas

Beiträge: 865

Wohnort: Frankfurt

  • Private Nachricht senden

3

19.12.2008, 17:15

OK danke, hab mal eben nachgeschaut. Leider nichts brauchbares auf deutsch gefunden. Also musst ich das auf englisch nehmen. Habs ja auch soweit verstanden nur ist mir eine Frage offen geblieben.

C-/C++-Quelltext

1
#ifndef H_

Bin ich recht der annahme das dieses große H die Endung von der Datei ist?

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

4

19.12.2008, 17:18

Das machen viele so, aber eigentlich ist es (fast) völlig egal welches "Wort" du als Include Guard nimmst. Ich persönlich mach das immer mit "HEADERNAME_H", hab aber auch schon sachen wie "b9db80e0-cde8-11dd-ad8b-0800200c9a66" gesehen. Wichtig ist halt nur, dass die Definition für jeden Header einzigartig ist.

DasBlub

Alter Hase

Beiträge: 802

Wohnort: Schweiz

Beruf: Programmierer

  • Private Nachricht senden

5

19.12.2008, 17:25

Re: Includieren Problem

Zitat von »"Errschaffer"«


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void Cmain::m_Schleife_M ()
{


//Spielfeldanlegen

Field.m_zeichnen_M ();
//Spieler 1 ist am Zug

Play.m_Spieler1_Zug (CFeld *o);
//Feld erneut zeichnen

Field.m_zeichnen_M ();

system ("pause");


}



der aufruf Play.m_Spieler1_Zug(CFeld *o) wird nicht funktionieren... du musst eine variable übergeben, nicht eine variable deklarieren ;)

Errschaffer

Alter Hase

  • »Errschaffer« ist der Autor dieses Themas

Beiträge: 865

Wohnort: Frankfurt

  • Private Nachricht senden

6

19.12.2008, 18:43

Eigentlich passt das jetzt nicht hier hin aber wo wir schonmal dabei sind.
Ich hab ein für mich sonderbares Porblem.
Also ich hab da ein Array das ein Member einer Klasse ist. Dem Array werden in einer Funktion der Klasse neue Werte zugewiesen. Geb ich diese aber in einer anderen Funktion der selben Klasse danach aus sind sie weg.
Es ist ein Array mit dem Typ bool und es hat zwei dimensionen.

Wie ich es bisher halt auch immer bei Tic-Tac-Toe gemacht habe.

Ich hab dazu mal zwei Screens gemacht.


(Link)




(Link)


Wie man sehen kann hab ihr mir ein paar Kontrollausgaben gemacht.

Bei der ersten Ausgabe wird der Boolische Wert des Array für [0] [0] ausgegeben.

Im 2.Screen kann man sehen das ich zwei Werte eingebe 1 und 1 welche wieder jeweils um eins verringert werden was ja logisch ist.
Diese werde an eine andere Klasse übergeben. Damit ich sehe ob die korrekt ankommen sind, habe ich nochmal eine Ausgabe für die Variabeln gemacht.
Dann in der Update Funktion wird einfach nur ein true für [0] [0] zugewiesen danach hab ich das Bool nochmal ausgegeben und es hat sich geändert (obwohl es sich eigentlich in 0 ändern sollte. 0 ist doch true oder? Naja aber wenigstens hat sich was getan).
Zum Schluss zeichne ich nochmal das Spielfeld und wieder die Bool Kontrolle. Aber jetzt ist es aufeinmal wieder auf 0.

Ich kapier das nicht. Das zeichnen und Updaten findet in der selben Klasse statt und das Array gehört auch zu dieser Klasse.


Ich bin echt ratlos.

edit: Braucht ihr etwas Code?

7

19.12.2008, 18:59

Zitat

0 ist doch true oder?

Nein.

Errschaffer

Alter Hase

  • »Errschaffer« ist der Autor dieses Themas

Beiträge: 865

Wohnort: Frankfurt

  • Private Nachricht senden

8

19.12.2008, 19:01

Nagut dann stimmt das mit der "1" ja doch.
Weiss jemand woran sowas liegen könnte das Daten einfach mal so verloren gehen?

9

19.12.2008, 19:03

Zeig mal ein bisschen was her.

Errschaffer

Alter Hase

  • »Errschaffer« ist der Autor dieses Themas

Beiträge: 865

Wohnort: Frankfurt

  • Private Nachricht senden

10

19.12.2008, 19:06

Also hier die Update Funktion (Testausgaben natürlich weg denken)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void CFeld::m_Update_Spieler1 (int ypos,int xpos)
{
    
    cout<<endl;
    cout<<"Werte der Variabeln:"<<endl;
    cout<<ypos<<endl;
    cout<<xpos<<endl;

    
    m_Spieler1Pos [ypos] [xpos]=true;

    cout<<endl<<endl;
    cout<<"bool Status (beim Updaten):"<<endl;
    cout<<m_Spieler1Pos [0] [0];
    cout<<endl<<endl;
    
    

    

}




Dann das zeichnen das Feldes.

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
void CFeld::m_zeichnen_M ()
{
    cout<<endl<<endl;
    cout<<"bool Status (beim zeichnen):"<<endl;
    cout<<m_Spieler1Pos [0] [0];
    cout<<endl<<endl;
    
for (int y=0;3>y;y++)
    {
        for (int x=0;3>x;x++)
        {
            if (m_Spieler1Pos [y] [x]==true)
                cout<<"X";
            else if (m_Spieler2Pos [y] [x]==true)
                cout<<"0";
            else 
                cout<<".";
        
        }
        cout<<endl;
    }



}




Und falls nötig noch die Funktion für ein Spielzug von Spieler1.

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
void CPlayer::m_Spieler1_Zug ()
{
    x=0;
    y=0;
    

    
    
    

    cout<<"Spieler 1 du bist nun am Zug"<<endl;
    cout<<"In welche Reihe möchtest du setzen?"<<endl;
    cout<<"Eingabe:";
    cin>>y;
    cout<<"In welche Spalte  möchtets du setzen?"<<endl;
    cout<<"Eingabe:";
    cin>>x;

    //Werte ändern weil Array mit 0 beginnt

    x=x-1;
    y=y-1;

    //Position für neuen Stein Updaten

    o.m_Update_Spieler1 (x,y);

}

Werbeanzeige