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

17.10.2009, 15:36

(Gelöst) Fehler in Kapitel 4, Listing 4.9?

Hallo zusammen,

es scheint als hat sich in Kapitel 4, Listing 4.9 (Lösungsvorschlag zur Aufgabe in Kapitel 4) ein Fehler eingeschlichen. Ich poste mal den Code, den ich vom Buch abgetippt habe:

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
// C++ für Spieleprogrammierer

// Listing 4.9

// 

//

#include<iostream>

using namespace std;

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

// 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(Wert, Prozent);
    Geschwindigkeit = addProzent(Wert, Prozent);

    // Ausgabe der neuen Werte

    cout << "\nNeue Charakterwerte: " << endl;
    cout << "Staerke: " << Staerke << endl;
    cout << "Geschwindigkeit: " << Geschwindigkeit << endl;
    
    return 0;
}

// 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, float Prozent)
{
    float neuerWert;
    neuerWert = Wert + (Wert * Prozent)/100;
    return neuerWert;
}

Mein Compiler spuckt (richtigerweise) folgende Fehlermeldungen aus:

Zitat

Fehler 1 error C2065: 'Wert': nichtdeklarierter Bezeichner
Fehler 2 error C2065: 'Prozent': nichtdeklarierter Bezeichner
Fehler 3 error C2065: 'Wert': nichtdeklarierter Bezeichner
Fehler 4 error C2065: 'Prozent': nichtdeklarierter Bezeichner


Ich habe den Quellcode so angepasst, wie ich es für richtig halten würde, aber leider gibt das immer noch einen Fehler. Ich poste mal meine erste Korrektur (Änderungen sind kommentiert)

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
// C++ für Spieleprogrammierer

// Listing 4.9

// 

//

#include<iostream>

using namespace std;

int addProzent(int Staerke, int Prozent); // Wert wurde durch Staerke ersetzt

float addProzent(float Geschwindigkeit, float Prozent); // Wert wurde durch Geschwindigkeit ersetzt


// Hauptprogramm

//

int main()
{
    // Variablen

    //

    int Staerke;
    float Geschwindigkeit; 
    int Prozent;

    // Abfrage der Werte

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

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

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

    // Neue Werte berechnen

    Staerke = addProzent(Staerke, Prozent);
    Geschwindigkeit = addProzent(Geschwindigkeit, Prozent);

    // Ausgabe der neuen Werte

    cout << "\nNeue Charakterwerte: " << endl;
    cout << "Staerke: " << Staerke << endl;
    cout << "Geschwindigkeit: " << Geschwindigkeit << endl;
    
    return 0;
}

// addProzent (für Integer-Werte

//

int addProzent(int Staerke, int Prozent)
{
    int neuerWert;
    neuerWert = Staerke + (Staerke * Prozent)/100;
    return neuerWert;
}

// addProzent (für float-Werte

//

float addProzent(float Geschwindigkeit, float Prozent)
{
    float neuerWert;
    neuerWert = Geschwindigkeit + (Geschwindigkeit * Prozent)/100;
    return neuerWert;
}

Der Compiler sagt daraufhin:

Zitat

Fehler 1 error C2666: 'addProzent': 2 Überladungen haben ähnliche Konvertierungen


Schlussendlich habe ich den Code dann so angepasst und das funktioniert auch.

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
// C++ für Spieleprogrammierer

// Listing 4.9

// 

//

#include<iostream>

using namespace std;

int addProzent1(int Staerke, int Prozent); //  addProzent wurde eine 1 angehängt

float addProzent2(float Geschwindigkeit, float Prozent); // addProzent wurde eine 2 angehängt


// Hauptprogramm

//

int main()
{
    // Variablen

    //

    int Staerke;
    float Geschwindigkeit; 
    int Prozent;

    // Abfrage der Werte

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

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

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

    // Neue Werte berechnen

    Staerke = addProzent1(Staerke, Prozent);
    Geschwindigkeit = addProzent2(Geschwindigkeit, Prozent);

    // Ausgabe der neuen Werte

    cout << "\nNeue Charakterwerte: " << endl;
    cout << "Staerke: " << Staerke << endl;
    cout << "Geschwindigkeit: " << Geschwindigkeit << endl;
    
    return 0;
}

// addProzent (für Integer-Werte

//

int addProzent1(int Staerke, int Prozent)
{
    int neuerWert;
    neuerWert = Staerke + (Staerke * Prozent)/100;
    return neuerWert;
}

// addProzent (für float-Werte

//

float addProzent2(float Geschwindigkeit, float Prozent)
{
    float neuerWert;
    neuerWert = Geschwindigkeit + (Geschwindigkeit * Prozent)/100;
    return neuerWert;
}


Mit überladenen Funktionen haben aber beide von mir korrigierten Fassungen nichts mehr zu tun. Mein Compiler ist Microsoft Visual C++ 2008 Express Edition. Hat der Autor jetzt einen Fehler gemacht, ist sein Code veraltet und überladenen Funktionen gibt es gar nicht mehr oder was ging hier schief?

Sc4v

Alter Hase

Beiträge: 376

Beruf: Student

  • Private Nachricht senden

2

17.10.2009, 15:45

Hi,

welche Auflage vom Buch hast du? Ich habe die 2. erweiterte Auflage und bei mir übergibt der Autor an die überladene addProzent funktion

C-/C++-Quelltext

1
2
3
    // Neue Werte berechnen

    Staerke = addProzent(Staerke, Steigerung);
    Geschwindigkeit = addProzent(Geschwindigkeit, Steigerung);


So sollte der Code auf jeden Fall funktionieren. Die Version von dir kann logischerweise nicht funktionieren da Wert und Prozent in der main Funktion nie definiert wurden.

Lg Sc4v

3

17.10.2009, 15:56

Ups. Das erste Beispiel beinhaltet den klassischen "Lesen will gelernt sein"-Fehler.

Habe das entsprechend korrigiert und bekomme nun aber immer noch

Quellcode

1
Fehler  1   error C2666: 'addProzent': 2 Überladungen haben ähnliche Konvertierungen
an den Kopf geworfen.

Ich habe auch die 2., erweiterte Auflage

Nachtrag: Ich habe eben das Beispiel von der CD geladen und das funktioniert. Dummerweise sehe ich die Unterschiede einfach nicht. Kann mir wer auf die Sprünge helfen?

Außerdem habe ich das Beispiel, so wie es der Autor schreibt nicht kapiert. so wie ich das geschrieben habe allerdings schon. Ist das nun tragisch und ich sollte mich dahinter klemmen oder kann man das ruhig auch so machen, wie ich es gemacht habe?

Sc4v

Alter Hase

Beiträge: 376

Beruf: Student

  • Private Nachricht senden

4

17.10.2009, 16:47

hi,

gut ich bin auch alles andere als der Programmierkönig =)
Bei mir geht der Code auf jeden Fall. Habe deinen fehlerhaften Code kopiert und wie ich beschrieben habe abgeändert und es geht. Ich benutze ebenfalls Visual C++ 2008 Express.
Also meiner Meinung nach (wie gesagt selber Anfänger) ist das überladen von Funktionen ein Thema das einem das programmieren wirklich leicher macht und man sollte das mit dem überladen schon verstehen weil man später auch operatoren überlädt und das auf jeden Fall wichtig ist.
Der Compiler unterscheidet halt aufgrund des Datentyps welche der beiden Funktionen er nun nehmen soll. Daher nimmt er bei Stärke die int addProzent und bei Geschwindigkeit die float addProzent Funktion.
Guck doch einfach mal wo der Fehler im Code auftrifft (doppelklick auf fehlermeldung) und drück mal F1 für genauere Informationen.

Lg
Sc4v

GR-PA

Treue Seele

Beiträge: 326

Wohnort: Daheim

Beruf: Faulenzer

  • Private Nachricht senden

5

17.10.2009, 16:48

http://msdn.microsoft.com/de-de/library/…28VS.80%29.aspx
Da du dem 2. Funktionsaufruf der überladenen Funktion als ersten Parameter einen float und als zweiten Parameter einen int-Wert übergibst, kann der Compiler nicht ermitteln, welche Version er benutzen soll (er müsste ja entweder den ersten oder den zweiten wert implizit casten). Das führt zu diesem Fehler.
Im Buch ist übrigens deshalb die Funktion so überladen:

C-/C++-Quelltext

1
float addProzent(float Wert, int Prozent);

Vermutlich hast du dich verlesen ;)
Signaturen werden überbewertet

6

17.10.2009, 17:17

Ach verflixt. Immer diese Dateitypen. Habe mich wirklich verlesen, bzw. einfach nicht richtig gelesen.

Was mir aber vom Verständnis her noch echte Probleme bereitet ist, dass ich nicht weis, woher Wert und Prozent in der Funktion die Werte hernehmen um damit die Stärke und die Geschwindigkeit aus zu rechnen. Da wird doch überhaupt nichts übergeben. Kann mir das noch jemand genauer erklären?

GR-PA

Treue Seele

Beiträge: 326

Wohnort: Daheim

Beruf: Faulenzer

  • Private Nachricht senden

7

17.10.2009, 17:26

Mit dem Aufruf

C-/C++-Quelltext

1
addProzent1(Staerke, Prozent);

übergibst du doch der Funktion die Werte von Staerke und Prozent. d.h. Dem ersten Parameter (Wert) wird der Wert von Staerke zugewiesen und dem zweiten Paramerter der Wert von Prozent.
Wenn du dass nicht verstehst solltest du vllt. das Kapitel über Funktionen nocheinmal durcharbeiten.
Signaturen werden überbewertet

Sc4v

Alter Hase

Beiträge: 376

Beruf: Student

  • Private Nachricht senden

8

17.10.2009, 17:37

bei mir kommt dann dennoch kein fehler obwohl ich einen int in einen float übergebe... er gibt mir lediglich eine warnung aus das es zu datenverlust durch das casten kommen kann

9

19.10.2009, 00:31

So, mit etwas Übung haut das nun auch hin. Habe sogar einzelne Bereiche des Spiels, was als nächstes kommt schonmal alleine geschrieben :D

Lerikson

Alter Hase

Beiträge: 412

Wohnort: nördlich von Hamburg

Beruf: Schüler

  • Private Nachricht senden

10

19.10.2009, 10:42

Zitat

Habe sogar einzelne Bereiche des Spiels, was als nächstes kommt schonmal alleine geschrieben


Übung macht den Meister :)
Errare est humanum. -Windows ist menschlich ;-)

Werbeanzeige