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

19.09.2006, 14:34

Kapitel 4.11 Listing 4.10

hier haben wir ersteinmal das listing:

// C++ für Spieleprogrammierer
// Listing 4.10
// Verwenden von eigenen .hpp- und .cpp-Dateien
//
#include <iostream>
#include "charakter.hpp"

using namespace std;

// Hauptprogramm
//
int main ()
{
// Variablen
//
int Staerke;
float Geschwindigkeit;
int Steigerung;

// Abfrage der Werte
cout << "Bisherige Staerke des Charakters: ";
cin >> Staerke;

cout << "Bisherige Geschwindigkeit des Charakters: ";
cin >> Geschwindigkeit;

cout << "Steigerung in Prozent: ";
cin >> Steigerung;

// Neue Werte berechnen
Staerke = addProzent (Staerke, Steigerung);
Geschwindigkeit = addProzent (Geschwindigkeit, Steigerung);

// Ausgabe der neuen Werte
cout << "\nNeue Charakterwerte: " << endl;
cout << "Staerke: " << Staerke << endl;
cout << "Geschwindigkeit: " << Geschwindigkeit << endl;

return 0;
}

in den berkungen zum kapitel steht nun drinne, dass .cpp dateien IMMER zum Projekt hinzugefügt werden müssen
Seite 115

im listing selber ist aber nur die hpp datei hinzugefügt.

"
int addProzent (int Wert, int Prozent);
float addProzent (float Wert, int Prozent);
"

die cpp aber nicht:
"
#include "charakter.hpp"

// addProzent (für Integer-Werte)
//
int addProzent (int Wert, int Prozent)
{
int neuerWert;
neuerWert = Wert + (Wert*Prozent)/100;
return neuerWert;
}

// addProzent (für Float-Werte)
//
float addProzent (float Wert, int Prozent)
{
float neuerWert;
neuerWert = Wert + (Wert*Prozent)/100.0f;
return neuerWert;
}
"

trotzdem funktioniert alles so wie es soll.

wie kann ich das nun verstehen?
bitte nur leicht verständliche antworten,

viel weiter bin ich auch noch nicht.



Noch ein Nachtrag, ich probiere mit diesen buch die grundlagen der Programmiersprache zu lernen, um auf diesen dann im nun beginnenden studium aufzubauen.
Im Studium werde ich dann aber Funktionen berechnen müssen (Integralrechnung und differenzialrechnung).
Noch die Frage, wie weit muß ich dafür das Buch durcharbeiten, was braucht man dafür, was braucht man nur für spieleprogrammierung,

was braucht man früher, womit kann man sihc zeit lassen?

Danke

Phili

unregistriert

2

19.09.2006, 14:55

@KaiserHannes
Du bringst da was durcheinander: Zum Projekt hinzufügen heißt nicht, sie irgendwo im Code aufzuschreiben, sondern dem Kompiler deutlich machen, dass sie dazugehört(Projekteinstellungen).

Sheddex

unregistriert

3

19.09.2006, 15:15

Schreib mal anstatt

C-/C++-Quelltext

1
#include "Character.hpp"


C-/C++-Quelltext

1
2
int addProzent (int Wert, int Prozent); 
float addProzent (float Wert, int Prozent);


bei beiden .cpp's.
Im Endeffekt ist es das gleiche, es werden eben nur die Prototypen benötigt damit der Copiler in einer der cpp's überhaupt "weiß" das addProzentüberhaupt existiert.

4

19.09.2006, 15:38

Zitat von »"Phili"«

@KaiserHannes
Du bringst da was durcheinander: Zum Projekt hinzufügen heißt nicht, sie irgendwo im Code aufzuschreiben, sondern dem Kompiler deutlich machen, dass sie dazugehört(Projekteinstellungen).


so habe das projekt noch einmal bei mir gelöscht, neu von der cd gezogen und neu probiert,

und schon meckert er rum nicht aufgelöstest objekt.

mit #include "charakter.cpp"

geht es dann,
Frage, wo ist das den in den einstellungen zu finden, das man es einfach dort einstellen kann?

5

19.09.2006, 15:42

Zitat von »"DarkHunter"«

Schreib mal anstatt

C-/C++-Quelltext

1
#include "Character.hpp"


C-/C++-Quelltext

1
2
int addProzent (int Wert, int Prozent); 
float addProzent (float Wert, int Prozent);


bei beiden .cpp's.
Im Endeffekt ist es das gleiche, es werden eben nur die Prototypen benötigt damit der Copiler in einer der cpp's überhaupt "weiß" das addProzentüberhaupt existiert.


so nach langem lesen denke ich wieß ich was du meinst,
aber das problem ist doch immer noch das die funktionen garnicht drinne sind im quelltext
und nur in charakter.cpp drinne steht was die funktionen machen sollen, und bei charakter.cpp wird ja auch charakter.hpp eingefügt.
oder vielleicht habe ich doch noch nicht verstanden was du meinst :D

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

6

19.09.2006, 16:15

Zitat von »"KaiserHannes"«


mit #include "charakter.cpp"

geht es dann,
Frage, wo ist das den in den einstellungen zu finden, das man es einfach dort einstellen kann?

Merke: Niemals *.cpp Dateien per #include einbinden.

Der Compiler kompiliert zuerst einzeln jede .cpp Datei in einem Projekt. In diese Dateien werden die Inhalte der per #include eingebundenen Dateien eingefügt. Der Linker nimmt dann die ganzen kompilierten Einzelstücke und setzt sie zusammen.

Jeder Compiler beruht (soweit ich weiß) auf Kommandozeilenparametern. In den Parametern muss jede verwendete .cpp Datei eingetragen werden. Die IDE mit der du arbeitest (VC++ vermute ich) muss jetzt mitbekommen, welche Dateien kompiliert werden sollen. Deswegen fügt man die Dateien zum Projekt hinzu.

Phili

unregistriert

7

19.09.2006, 16:34

@kaiser hannes
Du verstehsts immer noch nciht ganz... Ein Kompiler kompiliert alle cpp dateien, die zum Projekt gehören(bei Visual C++ über Projekt->Vorhandenen Element hinzufügen). Die header hingegen gehören nicht direkt zum Projekt, sondern werden in die cpp dateien eingebettet(per #include).

8

20.09.2006, 10:20

Zitat von »"Phili"«

@kaiser hannes
Du verstehsts immer noch nciht ganz... Ein Kompiler kompiliert alle cpp dateien, die zum Projekt gehören(bei Visual C++ über Projekt->Vorhandenen Element hinzufügen). Die header hingegen gehören nicht direkt zum Projekt, sondern werden in die cpp dateien eingebettet(per #include).


ok jetzt müßte ich es haben,

danke

indeed

Frischling

Beiträge: 8

Wohnort: Dortmund

  • Private Nachricht senden

9

11.10.2007, 20:43

hi,
ich bin auch gerade bei Listing 4.10 und hab mir die selbe Frage gestellt. Jetzt verstehe ich zwar, wie Compiler und Linker vorgehen, aber noch nicht so ganz warum. Denke ich zumindest. Die Vorgehensweise wäre doch:
1. .hpp Dateien in .cpp Dateien einbetten
2. .cpp Dateien zu Objektdateien kompilieren (also steht in jeder Objektdatei alles, was in dein eingebundenen .hpp Dateien steht)
3. Linker verbindet alle Objektdateien zu einer .exe oder was auch immer.
Wenn das so richtig ist verstehe ich nicht, warum man nicht einfach die .hpp Dateien wie die .cpp Dateien dem Projekt hinzufügen kann, so dass sie dann auch nur einmal am Anfang gebraucht werden. Wäre das nicht praktischer, da in diesem Fall nicht ich weiss nicht wie oft die gleiche Deklaration im Programm steht? Das müsste doch die Geschwindigkeit des Programm zumindest ein wenig reduzieren.
Oder geht es einfach darum, dass die Funktionen etc. nur dort eingebunden, also deklariert werden, wo sie auch gebraucht werden? Hat das irgendwelche Vorteile, also wird für eine Funktion, sobald sie deklariert wurde Speicherplatz reserviert? Nur wie soll das gehen? Der Kompiler "weiss" doch gar nicht wie die Funktion genau aussieht, also ob in dieser zB lokale Variablen definiert werden. Ich deklariere eine Funktion doch, damit der Kompiler weiss, dass sie später irgendwann einmal definiert wird oder hab ich da was falsch verstanden?
Kann ich die Bergriffe deklarieren/definieren für Funktionen überhaupt verwenden? Mir fällt gerade ein, dass in dem Buch immer von dem Prototyp einer Funktion die Rede war.

edit: "In der Datei charakter.hpp deklarieren wir ja unsere Funktionen, erstellen uns also somit unsere Funktionsprototypen."
Scheint also erlaubt zu sein ^^

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

10

11.10.2007, 22:43

Mit Speicherplatz hat die Sache wenig zu tun...
Wie du bereits erwähnt hast werden die .cpp Dateien zuerst in .obj Dateien kompiliert -> jede für sich. Bereits dort checkt der Compiler ob alles in Ordnung ist und nur dann geht es weiter mit linken. Wenn man jetzt keinen Prototyp der verwendeten Funktionen bereitstellt dann ist für den Compiler ein Funktionsaufruf einer Funktion die in einer anderen Datei steht lediglich ein nicht definiertes Symbol - da ja die Verknüpfung mit der anderen Datei, in der die Funktion definiert ist erst im nächsten Schritt (linken) erfolgen würde.


Hoffe das war jetzt halbwegs einleuchtend erklärt^^

Werbeanzeige