Du bist nicht angemeldet.

Werbeanzeige

1

14.06.2022, 11:31

Problem mit Listing 8.5

Hallo,

ich habe ein Problem, und würde mich freuen, wenn mir jemand helfen kann. Ich bin in dem Buch "C++ für Spieleprogrammierer" jetzt bei Listing 8.5 angelangt (wer es nicht weiß, dass sind Beispielcodeabschnitte in dem Buch zu einzelnen Themen). Wenn ich die herunterzuladene Datei dazu öffne, funktioniert auch alles. Wenn ich das Projekt und den Code jedoch selber anlege, spuckt der Compiler andauernd einen Fehler aus. Ich dachte erst es läge am Code, doch selbst wenn ich ein neues Projekt anlege und dann den Code aus dem anderen herunterzuladenem Listing 8.5 1:1 kopiere, tritt ein Fehler auf. (Darum dachte ich, es müsse vllt daran liegen, wie ich das Projekt anlege.) Als ich die zuherunterladene Datei das erste mal geöffnet habe, stand dort irgendwas in Richtung -veraltet- und ob ich es auf den neuesten Stand bringen will oder so ähnlich (Ich habe ja gesagt) (Info dazu: ich habe die Beipiele vorher immer abgetippt, diesmal zum ersten Mal ein Listing gedownloadet). Kann es sein, dass der Code damals als das Buch herauskam noch funktionierte, jetzt aber eine andere Schreibweise dafür üblich ist und wenn ich die herunterzuladene Datei öffne, erkennt er das und sorgt dafür, dass er gelesen werden kann, wenn ich ihn allerdings selber so schreibe, dann nicht? Ein Gedanke von mir. Ich weiß halt nicht, wo der Fehler liegt.

Wie ich selber das Projekt erstelle:
Datei -> Neu -> Projekt -> Leeres Projekt (Hiermit starten Sie von Grund auf neu mit C++ für Windows. Startdateien werden nicht bereit gestellt. Darunter steht: C++, Windows, Konsole) -> Ich gehe weiter und komme dann dahin, wo ich das Projekt benennen muss z.B. BListing8.5, den Speicherort angebe, und bei dem Feld ganz unten mache ich einen Harken bei "Platzieren Sie die Projektmappe und das Projekt im selben Verzeichnis." (habe es aber glaube ich auch schon einmal ohne Harken versucht). Dann bin ich in der Entwicklungsumgebung. Da gehe ich auf auf Quelldateien -> Hinzufügen -> neues Element ->
wähle C++-Datei(.cpp) -> nenne es z.B. BListing8_5.cpp -> Hinzufügen. Wieder in der Entwicklungsumgebung auf Headardatei -> Hinzufügen -> Neues Element -> gehe auf Headerdatei(.h) und als Name Raumschiff.hpp und hinzufügen. Das "#pragma once lösche ich, weil es im Listing auch nicht steht. (Habe es aber auch schon mit stehenlassen probiert.)
Dann kopiere ich den Text aus den herunterladbaren Listings hinein, gehe auf Debuggen -> starten ohne Debuggen und es tritt ein Fehler auf.

Hier ist der Fehlerquelltext:
Erstellen gestartet...
1>------ Erstellen gestartet: Projekt: BListing8.5, Konfiguration: Debug Win32 ------
1>BListing8_5.cpp
1>C:\Users\Acer\source\repos\BListing8.5\Raumschiff.hpp(26,2): error C2065: "cout": nichtdeklarierter Bezeichner
1>C:\Users\Acer\source\repos\BListing8.5\Raumschiff.hpp(26,2): error C3861: "cout": Bezeichner wurde nicht gefunden.
1>C:\Users\Acer\source\repos\BListing8.5\Raumschiff.hpp(27,2): error C2065: "cout": nichtdeklarierter Bezeichner
1>C:\Users\Acer\source\repos\BListing8.5\Raumschiff.hpp(27,2): error C3861: "cout": Bezeichner wurde nicht gefunden.
1>C:\Users\Acer\source\repos\BListing8.5\Raumschiff.hpp(27,10): error C3861: "endl": Bezeichner wurde nicht gefunden.
1>C:\Users\Acer\source\repos\BListing8.5\Raumschiff.hpp(37,2): error C2065: "cout": nichtdeklarierter Bezeichner
1>C:\Users\Acer\source\repos\BListing8.5\Raumschiff.hpp(37,2): error C3861: "cout": Bezeichner wurde nicht gefunden.
1>C:\Users\Acer\source\repos\BListing8.5\Raumschiff.hpp(38,2): error C2065: "cout": nichtdeklarierter Bezeichner
1>C:\Users\Acer\source\repos\BListing8.5\Raumschiff.hpp(38,2): error C3861: "cout": Bezeichner wurde nicht gefunden.
1>C:\Users\Acer\source\repos\BListing8.5\Raumschiff.hpp(38,10): error C3861: "endl": Bezeichner wurde nicht gefunden.
1>Die Erstellung des Projekts "BListing8.5.vcxproj" ist abgeschlossen -- FEHLER.
========== Erstellen: 0 erfolgreich, 1 fehlerhaft, 0 aktuell, 0 übersprungen ==========

Würde mich echt freuen, wenn ihr mir helfen könnt. Und bitte seid bei den Formulierungen bitte nicht zu fachlich, ich habe das Buch zwar zur Hälfte durch, bin aber denke ich doch noch Anfänger. :)

Mit freundlichen Grüssen

Daniel

David Scherfgen

Administrator

Beiträge: 10 370

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

14.06.2022, 12:27

Wahrscheinlich fehlt folgende Zeile in deinem Code:

C-/C++-Quelltext

1
using namespace std;

3

14.06.2022, 18:50

Wahrscheinlich fehlt folgende Zeile in deinem Code:

C-/C++-Quelltext

1
using namespace std;


Hey vielen Dank für die schnelle Antwort, ja das war es :) Allerdings muss ich sagen, dass ich jetzt dennoch verwirrt bin.
Das Listing bestand aus zwei Teilen, die eine eine cpp, die andere einer Headerdatei. Ich werde die beiden Codes gleich
im Anschluss mal hier reinkopieren. Ich konnte das Problem lösen, indem ich "using namespace std" ebenfalls oben in die
Headerdatei eingefügt habe oder indem ich "using namespace std" einfach über #include <iostream> und #include "Raumschiff.hpp"
in der cpp Datei gesetzt habe, statt darunter. Aber das für mich verwirrende ist, dass Heiko Kalista in seinem Buch und
Begleitmaterial, dass man downloaden kann, dies bei diesem Listing ebenfalls nicht gemacht hat, und dennoch spuckt der Kompiler
keinen Fehler aus. Dort gibt es Beispiele und Beispielprojekte, die man downloaden und in Visual Studio öffnen kann.
Und eines davon heißt Listing 8.5. Es besteht aus einer cpp und einer hpp Datei. Wenn ich dies downloade und öffne, gibt es keinen Fehler.
Wenn ich aber den Text 1:1 kopiere und in eine cpp und hpp Datei (mit gleichen Namen) einfüge, die ich selber angelegt habe,
gibt es den besagten Fehler.
Dabei steht das using namespace std. bei seiner Datei (die gedownloadete, die funktioniert) exakt an der selben Stelle, wo
es bei mir nicht funktioniert. Ich würde das verstehen, warum das so ist, damit ich es für später weiß und vllt die Situation
etwas besser verstehe und daraus lernen kann. Wäre nette, wenn du weißt warum, dass du es mir einmal erklären kannst.

Ich kann dir ja mal die beiden Text abschnitte und einen Link zu den Listing Downloads hier mit rein setzen:

Listing_8_5.cpp:

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
#include <iostream>
#include "Raumschiff.hpp"

using namespace std;

// Hauptprogramm
//
int main()
{
    // Variablen
    //
    CRaumschiff<int>    Spieler;     // Ein Raumschiff für den Spieler
    CRaumschiff<float>  Gegner;      // Ein Raumschiff für den Gegner

    // Geschwindigkeit des Spielers setzen und anzeigen
    Spieler.Setze_Geschwindigkeit(1500);
    Spieler.Zeige_Daten();

    Gegner.Setze_Geschwindigkeit(960.95f);
    Gegner.Zeige_Daten();

}


Raumschiff.hpp

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
template <class T>
class CRaumschiff
{
private:

    // Membervariablen
    T m_Geschwindigkeit;

public:

    // Memberfunktionen
    void Setze_Geschwindigkeit(T Geschwindigkeit);
    void Zeige_Daten();

};

// Setze_Geschwindigkeit
// 
// Aufgabe: Neue Geschwindigkeit für das Raumschiff festlegen
//
template <class T>
void CRaumschiff<T>::Setze_Geschwindigkeit(T Geschwindigkeit)
{
    m_Geschwindigkeit = Geschwindigkeit;

    cout << "Neue Geschwindigkeit    : " << m_Geschwindigkeit;
    cout << endl;
} // Setze_Geschwindigkeit

// Zeige_Daten
//
// Aufgabe: Daten des Raumschiffes anzeigen
//
template <class T>
void CRaumschiff<T>::Zeige_Daten()
{
    cout << "Aktuelle Geschwindigkeit: " << m_Geschwindigkeit;
    cout << endl;
} // Zeige_Daten


Und dies wäre der Downloadlink, falls du dich einmal selbst davon überzeugen willst.
Ich gehe mal davon aus, es ist ok, in in diesem Forum zu posten:
https://downloads.hanser.de/index.asp?is…5834&nav_page=2

4

14.06.2022, 23:39

Hallo DanielZ,

1.
In C++ wird jede *.cpp Datei von oben nach unten übersetzt.
Erst läuft der Präprozessor drüber und führt alle Präprozessoranweisungen aus. (Die mit der Raute '#')
Trifft der Präprozessor auf ein #include ... , kopiert er den ganzen Text aus der angegebenen Datei an diese stelle.
Als zweites nimmt der Compiler den vor übersetzten Text des Präprozessors und übersetzt ihn zu einer Objektdatei. (z.B. *.obj)
Als letzten Schritt nimmt der Linker alle Objektdateien und löst alle verweise, zwischen den Objektdateien, auf und erstellt die Ausführbare Datei.

2.
In C++ müssen alle benutzten Objekte und Methoden Vorwärtsdeklariert werden. Sie müssen für die Benutzung vorher bekannt gemacht werden.
Mit #include <iostream> kopierst du die Deklaration von cout und endl hinein und sie werden zur späteren Benutzung bekannt gemacht.

3.
cout und endl sind im Namensraum std deklariert worden. Daher muss man dem Compiler den Namespace mitteilen.
Das macht man durch angeben des Namespaces, also überall cout und endl durch std::cout und std::endl ersetzen oder
den ganzen Namespace global verfügbar machen durch: using namespace std; (Man kann auch einzelne Sachen global verfügbar machen z.B. mit: using std::cout; using std::endl; )

4.
In Listing_8_5.cpp wird nichts aus iostream und somit nichts aus std verwendet, deshalb sollte dort am Anfang nicht #include <iostream> und auch nicht using namespace std; stehen. Sonder nur #include "Raumschiff.hpp" .
In Raumschiff.hpp musst du vor Verwendung cout und endl bekannt machen, also am Anfang #include <iostream> und using namespace std; hinzufügen.

Viel Glück

David Scherfgen

Administrator

Beiträge: 10 370

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

5

15.06.2022, 06:18

@DanielZ: Wenn du Code ins Forum postest, nutze bitte Code-Tags, damit der Code auch gut lesbar ist. Ich habe das mal für dich gemacht.

6

16.06.2022, 17:00

Hey Hannes, vielen Dank für die ausführliche Beschreibung der Funktionsweise des Kompilers. Ich lese den Text später nochmal ausführlich und wenn ich
dann noch Fragen habe, schiebe ich sie hinterher ;) Jetzt gerade wollte ich einfach einmal zur Kenntnis geben, dass ich die Antwort wahrgenommen habe
und mir später nochmal genauer ansehe, damit es nicht wirkt, als wäre es untergegangen :)

Werbeanzeige