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

20.04.2006, 21:10

4.9 Augabenstellung (brauche nur nen Tipp KEINE lösung ^^)

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
#include <iostream>

using namespace std;

void Steigerung (int Strengh, int Agility);

void Steigerung (float Strengh, float Agility);



main()

{
    int Strengh = 20;
    float fAgility = 15;
    int Agility = 15;
    float fStrengh = 20;

    //Vorher


    cout << "Vorher:\n"<< Agility;
    cout << " \nStaerke:\n" << Strengh;

    Steigerung (Strengh, Agility);
    Steigerung (fStrengh, fAgility);

    // nachher


    cout << "\n \n\n\n Spaeter:\n" << Agility;
    cout << "\nStaerke:\n" << Strengh;
    cout << "\n\n\n";
    

    return 0;
    
}

//die Funktion:


void Steigerung (int Strengh, int Agility)

{
    Strengh = Strengh/10 + Strengh;
    Agility = Agility/10 + Agility;
}

void Steigerung (float Strengh, float Agility)

{
    Strengh = Strengh/10 + Strengh;
    Agility = Agility/10 + Agility;
}

[Spik spendierte die Tags ;)]

Das ist der Quelltext ich weiss net ob mein fehler bei

Zitat

//die Funktion:

void Steigerung (int Strengh, int Agility)

{
Strengh = Strengh/10 + Strengh;
Agility = Agility/10 + Agility;
}

void Steigerung (float Strengh, float Agility)

{
Strengh = Strengh/10 + Strengh;
Agility = Agility/10 + Agility;
}


oder woanders liegt :/

Ich brauch lediglich einen Hinweis wo es sein könnte er kompiliert zwar aber erhöht die werte net.
Gruß

kalo

--------------------------------------------------------------
Wichtig:
Das Krümmelmonster darf aus Gesundheitsgründen nurnoch Gemüse essen.

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

2

20.04.2006, 21:13

bitte poste mal die Aufgabenstellung (in etwa mit und nimm cpp Tags thx

3

20.04.2006, 21:18

EIn Charakter hat in Rollenspielen Verschiedene Attribute und Fähigkeiten, die er im Laufe der Zeit verbessern kann. Dazu gehören etwa Stärke, Intelligenz und Geschwindigkeit um nur einige zu nennen. Jedes Mal, wenn der Charakter einen Level aufsteigt, können diese werte um einen Gewissen Prozentsatz gesteigert werden. Bei dieser Aufgabe vereinfachen wir das Ganze ein bisschen und beschrönken uns auf zwei Werte: Stärke und Geschwindigkeit. Die Stärke soll dabei ein int-Wert sein, die Geschwindigkeit ein float-Wert. Diese beiden Werte sollen nun durch eine Funktion um einen Gewissen Prozensatz erhöht werden können. Dazu sollen zuerst Stärke, Geschwindigkeit und der Prozentsatz für die Steigerung abgefragt werden. Danach sollen die neuen Werte berechnet und ausgegeben werden.

(Als hinweis steht da, das man eine überlandene Funtion nehmen sollte, welche zwei Seiten vorher erklärt wurde.)
Gruß

kalo

--------------------------------------------------------------
Wichtig:
Das Krümmelmonster darf aus Gesundheitsgründen nurnoch Gemüse essen.

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

4

20.04.2006, 21:36

So nur um mal eine Fehlerquelle zu finden:

C-/C++-Quelltext

1
2
3
4
5
6
void Steigerung (int Strengh, int Agility)

{
Strengh = Strengh/10 + Strengh;
Agility = Agility/10 + Agility;
}



Das kann nie so funktionieren. Erstens machst du etwas illegales, den irgendwas dividieren und dann in einen Int (Gaanzzahl Wert) zu klatschen ist etwas, unschön viel besser so: oder mit static_cast Operator.

C-/C++-Quelltext

1
2
3
4
5
6
void Steigerung (int Strengh, int Agility)

{
Strengh = (int)(Strengh/10) + Strengh;
Agility = (int)(Agility/10) + Agility;
}


Nun manipulierst du zwar die Werte, aber diese zwei Variablen haben nur in dieser Funktion ihre werte, wenn diese beendet wird (}), dann sind die wech, und nix ist geschehen.

Wir könnten das ja so machen:

C-/C++-Quelltext

1
2
3
4
5
6
int Steigerung (int Strengh, int Agility)

{
Strengh = (int)(Strengh/10) + Strengh;
return Agility = (int)(Agility/10) + Agility;
}


Das Funktioniert so prima, nur ein Problem: Strenght geht verloren in der Funktion, nur Agil können wir retten.
Dehalb muss ein ganz neuer Ansatz her. Wir sagen einfach: OK, pass auf, Strenght und Agil sind Variablen, diese wollen wir wenn du die Funktion beendest aner wieder zurück. Das machen wir mit dem Referenz Operator. (&)

C-/C++-Quelltext

1
2
3
4
5
6
void Steigerung (int &Strengh, int &Agility)

{
Strengh = (int)(Strengh/10) + Strengh;
Agility = (int)(Agility/10) + Agility;
}


das funktioniert doch schon ganz prima. Noch schöner wäre es mit Pointern.

C-/C++-Quelltext

1
2
3
4
5
6
void Steigerung (int *Strengh, int *Agility)

{
*Strengh = (int)(*Strengh/10) + *Strengh;
*Agility = (int)(*Agility/10) + *Agility;
}


So. Der Funktionskopf sagt uns: Gib mit zwei Adressen (aus dem Hauptspeicher) die auf die Varible Strenght und Agil zeigen. Damit haben wir KEINE Werte, sondern Adresse. Um nun wieder die Adresse in einen Wert zurückzuverwandeln, setzen wir nochmals den * Operator ein, um eine Adresse zzu dereferenzieren (näheres siehe Buch)

5

20.04.2006, 21:41

Ganz doof gefragt:
Wozu sind Pointer da?
Gruß

kalo

--------------------------------------------------------------
Wichtig:
Das Krümmelmonster darf aus Gesundheitsgründen nurnoch Gemüse essen.

Yoshi

Frischling

Beiträge: 61

Beruf: Schüler

  • Private Nachricht senden

6

20.04.2006, 21:43

Ich hätt auch eine Frage dazu und zwar:

Warum sind pointer in dem Fall besser als Referenzen?

Yoshi

7

20.04.2006, 22:04

da kommt:
Temporäre Dateien und Ausgabedateien für "fd - Win32 Debug" werden gelöscht.
--------------------Konfiguration: fd - Win32 Debug--------------------
Kompilierung läuft...
fd.cpp
Linker-Vorgang läuft...
fd.obj : error LNK2001: Nichtaufgeloestes externes Symbol "void __cdecl Steigerung(float,float)" (?Steigerung@@YAXMM@Z)
fd.obj : error LNK2001: Nichtaufgeloestes externes Symbol "void __cdecl Steigerung(int,int)" (?Steigerung@@YAXHH@Z)
Debug/fd.exe : fatal error LNK1120: 2 unaufgeloeste externe Verweise
Fehler beim Ausführen von link.exe.

fd.exe - 3 Fehler, 0 Warnung(en)


:/

naja ich probiers ma etwas selbst weiter... selbst ist der mann (hier der jugendliche *g*) :)
Gruß

kalo

--------------------------------------------------------------
Wichtig:
Das Krümmelmonster darf aus Gesundheitsgründen nurnoch Gemüse essen.

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

8

20.04.2006, 22:26

@Kalo
Du musst die Deklaration und die Definition anpassen, diese müssen identisch sein!

Deklaration:

C-/C++-Quelltext

1
int GetValidApple(int a);


Definition

C-/C++-Quelltext

1
2
3
4
int GetValidApple(int a)
{
  return 6;
}


Weiterhin war das nur zur Veranschulichung gedacht. Die Beispiele denk ich mir aus, sollten wenn mgl. auch funktionenieren, aber wird nie gestestet.

@Pointer.

Mit Pointern kann man noch ne ganze menge anderer Sachen noch machen (Thema dynamische/rekursive Datentypen), die man nicht mit Referenzen machen kann. Referenzen braucht man eigentlich gar nicht, aber es macht sich vieles mit ihnen einfacher.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
struct ListNode
{
  int value;
  struct ListNode *Next;
}
typedef ListNode *List;

// Erstes Listenelement hat den Wert 9

// List.value = 9;

// Zweites Listenelement hat den Wert 7

// List->Next.value = 7;

// Drittes Listenelement hat den Wert 5

// List->Next->Next.value = 5;

9

20.04.2006, 23:00

Zitat von »"koschka"«

So nur um mal eine Fehlerquelle zu finden:

C-/C++-Quelltext

1
2
3
4
5
6
void Steigerung (int Strengh, int Agility)

{
Strengh = Strengh/10 + Strengh;
Agility = Agility/10 + Agility;
}



Das kann nie so funktionieren. Erstens machst du etwas illegales, den irgendwas dividieren und dann in einen Int (Gaanzzahl Wert) zu klatschen ist etwas, unschön viel besser so: oder mit static_cast Operator.

C-/C++-Quelltext

1
2
3
4
5
6
void Steigerung (int Strengh, int Agility)

{
Strengh = (int)(Strengh/10) + Strengh;
Agility = (int)(Agility/10) + Agility;
}



So nen quatsch. Er hat genau das richtige gemacht. In CPP entspricht "int" / "int" dem DIV (auch Division ohne Rest genannt) in anderen Programmiersprachen. Es kommt somit wieder ein Integer heraus!

Wenn du einen Floatwert erhalten wolltest, müsstes du einen der Operatoren als Float haben.

C-/C++-Quelltext

1
2
3
4
5
6
7
Z.B.:

5/3 = 1

aber

5/3.0 = 1.66666667

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

10

20.04.2006, 23:11

Es schadet nie auf Typkonverterungen zu achten. Besonders bei solchen Fällen, so gewöhnt man sich dran und macht nicht weitere (logischen) Fehler.

Ich glaube wir brauchen uns deshalb nicht zu streiten was muss und was unter Umständen kann. Mit der Variante unten ist es eineindeutig klar und genau darum gings mir.

Werbeanzeige