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

Anonymous

unregistriert

1

19.07.2008, 14:55

Ich kapiers nie mit den Funktionen

Hallo, ich habe jetzt schon zum 31ten mal das 4te Kapitel gelesen, OHNE Erfolg. Ich versteh einfach nicht, worüber Heiko schreibt und was er damit sagen will. Ich bitte euch um Hilfe. Ja, den Anfang versteh ich aber nur das:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>

using namespace std;

void meineFunktion ();

int main ()
{
    void meineFunktion ();
    return 0;
}
    void meineFunktion ()
    {
        cout << "Hallo" << endl;
    }


Ich habe wirklich alles gemacht, was ihr gesagt habt. Ich habe es nicht nur gelesen, sondern es auch gelernt und ausprobiert, doch ich komm einfach nicht weiter. Es ist mir zu schwierig, das was Heiko im Buch sagen will. Wisst ihr, wie man das einfacher Ausdrücken kann? Ich bitte euch so sehr um Hilfe!!!

Mfg Evilon

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

2

19.07.2008, 15:13

Sag doch mal was genau du nicht verstehst? Ich hab das Buch nicht und kann daher nicht nachlesen, was in Kapitel 4 noch so erklärt wird.
An dem Code den du gepostet hast kann ich leider auch nicht erkennen, was du verstanden hast und was nicht. Denn man kann ja nicht sagen: Ich hab verstanden, dass ich eine Funktion erstellen kann, in der kann man mit std::cout einen Text ausgeben, aber ich weiß nicht, was ich noch damit anstellen soll.
Also erklär einfach mal was dir spanisch vorkommt an Funktionen und erkläre in Worten, was du an Funktionen verstanden hast und weshalb man sie deiner Meinung nach verwendet. Danach wird einem oftmals schon selbst sehr viel mehr klar, wenn man das mal in Worte gefasst hat...

Anonymous

unregistriert

3

19.07.2008, 15:17

Mit dem Code dachte ich, dass ich nur mit Funktionen Text auf den Bildschirm bringen kann. Was ich nicht versteh' ist das mit bool, mit inline und __forceinline und den Variablen in ner Funktion...

Kurz:
Alles kommt mir spanisch vor.

4

19.07.2008, 15:39

Zitat

dass ich nur mit Funktionen Text auf den Bildschirm bringen kann

Nein, das könntest genau so gut in der main - Funktion machen.

Zitat

Was ich nicht versteh' ist das mit bool

"bool" an sich hat ja nichts mit Funktionen zu tun. Das ist ja ein Variablentyp wie "int", "char" usw.

Zitat

und den Variablen in ner Funktion...

Mit den Variablen in einer Funktion ist es eigentlich genau gleich wie in der main-Funktion. Du solltest beachten, dass die Variablen, die du in einer Funktion "erstellt" hast, beim Verlassen der Funktion wieder "gelöscht" werden.
Wenn du Folgendes hast

C-/C++-Quelltext

1
2
3
4
5
6
void meineFunktion()
{
int i=0;
i++;
cout << i;
}

und diese 10 mal aufrufst, so steht immer '1' da.

Wüsste gerade nicht was ich noch erzählen sollte.
Das Problem ein bisschen genauer zu beschreiben wäre toll. Wenn dir alles spanisch vorkommt, dann machst wohl irgendwas falsch...

the[V]oid

Alter Hase

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

5

19.07.2008, 16:01

Ich komme leider auch nicht dahinter, was du genau verstanden / nicht verstanden hast ;)
Ich versuche mal, das ganze etwas anschaulich zu erklären:

Denke dir ein Programm mal als eine Ansammlung von Zetteln (ich verwende jetzt die Analogie Zettel = Funktion). Jeder Zettel hat einen Namen (den Namen der Funktion) und ferner stehen auf ihm beliebig viele Befehle, die von oben nach unten abgearbeitet werden. Jetzt spielen wir mal ein kleines Beispielszenario durch:

Es gibt eine Hauptfunktion, das ist ein besonderer Zettel. Dieser nennt sich main. Außerdem hast du noch zwei Zettel, der eine nennt sich meineFunktion1 und der andere meineFunktion2. Auf dem Zettel main steht jetzt:

Quellcode

1
2
3
Mache irgendwas;
meineFunktion1 ();
Mache noch mehr irgendwas;

Und auf dem Zettel meineFunktion1 könnte stehen:

Quellcode

1
2
3
Mache irgendwas;
meineFunktion2 ();
Mache Quatsch;

Und schließlich auf dem Zettel meineFunktion2:

Quellcode

1
cout << "Hallo" << endl;


Nun starten wir mal das Programm. Das ist jetzt zwar aus technischer Sicht nicht ganz korrekt, hilft aber der Anschauung: Der Rechner ließt immer zuerst den Zettel main und führt aus, was darauf steht, und zwar in derselben Reihenfolge wie es dort steht. Zuerst wird also irgendwas gemacht, was uns nicht weiter interessiert, dann ließt der Rechner die Zeile "meineFunktion1 ()". Hier erkennt er: "Jetzt geht's weiter auf dem Zettel meineFunktion1!" Also holt er den Zettel meineFunktion1 raus und fängt hier wieder von Anfang an an zu lesen und die Befehle auszuführen: Zuerst wird irgendwas blödes erledigt, dann stößt er auf die Zeile "meineFunktion2 ();" - Und wieder versteht der Rechner: "Jetzt geht's weiter auf Zettel meineFunktion2!" Auf diesem Zettel jedoch nur ein einziger Befehl, und der bedeutet: "Gebe den Text hallo[i] aus!" Dies wird erledigt, und da dies der letzte Befehl auf dem Zettel war, wird er wieder weggelegt und der vorherige rausgekramt ([i]meineFunktion1). Hier macht der Rechner wieder dort weiter, wo er vorhin stehen geblieben war und führt deswegen die 3. Zeile aus, die irgend einen Quatsch erledigt. Da auch das wieder die letzte Zeile des jeweiligen Zettels ist, wird dieser Zettel auch wieder weggelegt und stattdessen der Zettel, der vorher dran war, nämlich main[i], wieder hervor geholt. Hier geht es weiter mit der Zeile "Mache noch mehr irgendwas". Da auch dieser Zettel nun fertig abgearbeitet ist, wird das Programm beendet.

Das ist so das grundlegende Prinzip hinter Funktionen. Es ist übrigens sogar technisch korrekt, sich die Zettel beim Abarbeiten durch den Rechner als einen Stapel vorzustellen, wobei der oberste Zettel immer der ist, der gerade abgearbeitet wird: Und wenn ein neuer Zettel hervorgekramt wird, wird dieser ganz oben auf den Stapel gelegt, und sobald er fertig ist, wieder runtergeholt.

Nun mal zu den Besonderheiten. Man kann einen Zettel als "inline" kennzeichnen. Dies hat zur Folge, dass der als "inline" gekennzeichnete Zettel, sobald er "aufgerufen" wird, nicht herausgekramt und oben auf den Stapel gelegt wird, sondern das, was auf dem Zettel steht, an der Stelle auf dem Zettel, der den "inline"-Zettel aufgerufen hat, quasi per "copy&paste" eingefügt wird. Für den Gelenheitsprogrammierer ist der Unterschied, der sich dadurch ergibt, wohl nicht weiter von Belang. Anschaulich kannst du dir den Unterschied aber so denken: Du sparst durch "inline"-Zettel im Vergleich zu nicht-"inline"-Zettel etwas Zeit ein, da du dir nicht die Arbeit machen musst, ihn zu suchen und auf den Stapel zu legen und später wieder vom Stapel runterzuholen. Ein Nachteil ergibt sich dann, wenn du dir mal vorstellst, der "inline"-Zettel würde mehrmals aufgerufen werden. In dem Fall wird der Inhalt des "inline"-Zettels vielfach an anderer Stelle eingefügt, wodurch sich die Gesamtmenge an Befehlen (Code) aufbläht.

Das mit dem "bool" habe ich jetzt keine Zeit mehr zu erklären und "forceinline" ist mir nicht bekannt ^^
<< an dieser Stelle ist eine Signatur verstorben >>

Anonymous

unregistriert

6

19.07.2008, 16:36

Ungefähr so?

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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
// Weg des Wissens

// Ein Quiz

//

#include <iostream>

using namespace std;

int Spielen (int Auswahl, int Lebensenergie)

int main ();
{
    // Variablen

    //

    int Auswahl = 0;
    int Lebensenergie = 100;

    // while-Schleife

    while (Auswahl == 3)
    {
        // Das Menü

        cout << "Weg des Wissens" << endl;
        cout << "===============" << endl;
        cout << "1) Spielen" << endl;
        cout << "2) Handbuch" << endl;
        cout << "3) Beenden" << endl;
        cout << "===" << endl;
        cout << "Deine Wahl: ";
        cin >> Auswahl;
        cout << "===============" << endl;
        cout << "\n\n\n";

        if (Auswahl == 1)
        {
            int Spielen (int Auswahl, int Lebensenergie)
        }

        else if (Auswahl == 2)
        {
            cout << "Werde zum Wissenskönig, indem du viele unterschiedliche Fragen gestellt kriegst!" << endl;
            cout << "\n\n\n"
        }

        else if (Auswahl == 3)
        {
            cout << "Bye!" << endl;
        }
        else
        {
            cout << "ERROR: Falsche Eingabe!";
        }
    }
        return 0;
}
// Spielen

int Spielen (int Auswahl, int Lebensenergie);
{
    // Variablen

    //

    int Auswahl = 0;
    int Lebensenergie = 100;

    // while-Schleife

    while (Lebensenergie != 0)
    {
        cout << "1 + 1 = ";
        cin >> Auswahl;
        {
            if (Auswahl == 2)
            {
                cout << "Richtig\n" << endl;
            }

            else
            {
                cout << "Falsch\n" << endl;
            }
        }
    }
    return Auswahl;
    return Lebensenergie;
}


Es sind drei Fehler drin, hat das etwas mit den Funktionen zu tun?

Quellcode

1
2
3
4
5
6
7
8
9
1>------ Erstellen gestartet: Projekt: Weg des Wissens, Konfiguration: Debug Win32 ------
1>Kompilieren...
1>Weg des Wissens.cpp
1>c:\users\luca\documents\visual studio 2008\projects\weg des wissens\weg des wissens\weg des wissens.cpp(10) : error C2144: Syntaxfehler: 'int' sollte auf ';' folgen
1>c:\users\luca\documents\visual studio 2008\projects\weg des wissens\weg des wissens\weg des wissens.cpp(11) : error C2447: '{': Funktionsheader fehlt - Parameterliste im alten Stil?
1>c:\users\luca\documents\visual studio 2008\projects\weg des wissens\weg des wissens\weg des wissens.cpp(56) : error C2447: '{': Funktionsheader fehlt - Parameterliste im alten Stil?
1>Das Buildprotokoll wurde unter "file://c:\Users\Luca\Documents\Visual Studio 2008\Projects\Weg des Wissens\Weg des Wissens\Debug\BuildLog.htm" gespeichert.
1>Weg des Wissens - 3 Fehler, 0 Warnung(en)
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========

SirForce

Alter Hase

Beiträge: 802

Wohnort: Süddeutschland

  • Private Nachricht senden

7

19.07.2008, 17:11

Schau dir das ganze nochmal gaaaanz genau an - wenn man sowas schon programmiert, dann sollte man Syntaxfehler entweder schon vermeiden können, oder wenigstens in der Lage sein, sie zu finden!

->Mach mal einen Doppelklick auf die Fehlermeldung!
Nichts behindert so sehr die Entwicklung der Intelligenz wie ihre vollständige Abwesenheit.

Michail Genin

8

19.07.2008, 17:12

Hier fehlt dir schon mal ein Semikolon:

C-/C++-Quelltext

1
int Spielen (int Auswahl, int Lebensenergie) // <- dort

und hier

C-/C++-Quelltext

1
2
3
4
if (Auswahl == 1)
        {
            int Spielen (int Auswahl, int Lebensenergie) // <- dort, "int" entfernen      

        } 


Das ist unnütz:

C-/C++-Quelltext

1
2
return Auswahl;
return Lebensenergie; 

Auswahl wird zurückgegeben, "return Lebensenergie;" wird nie ausgeführt

//Edit
Sorry SirForce, mein Post kam zu spät...

Anonymous

unregistriert

9

19.07.2008, 17:27

Oh, danke... Manchmal frage ich mich: Stelle ich mich nur dumm an oder BIN ich dumm?!?

Aber das hier versteh ich nun wirklich nicht:

Quellcode

1
2
3
4
5
6
7
8
1>------ Erstellen gestartet: Projekt: Weg des Wissens, Konfiguration: Debug Win32 ------
1>Kompilieren...
1>Weg des Wissens.cpp
1>c:\users\luca\documents\visual studio 2008\projects\weg des wissens\weg des wissens\weg des wissens.cpp(11) : error C2447: '{': Funktionsheader fehlt - Parameterliste im alten Stil?
1>c:\users\luca\documents\visual studio 2008\projects\weg des wissens\weg des wissens\weg des wissens.cpp(56) : error C2447: '{': Funktionsheader fehlt - Parameterliste im alten Stil?
1>Das Buildprotokoll wurde unter "file://c:\Users\Luca\Documents\Visual Studio 2008\Projects\Weg des Wissens\Weg des Wissens\Debug\BuildLog.htm" gespeichert.
1>Weg des Wissens - 2 Fehler, 0 Warnung(en)
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========


Welchen alten Stil?!?

10

19.07.2008, 17:31

Da hast du wohl noch ein Semikolon falsch gesetzt:

C-/C++-Quelltext

1
2
3
4
// Spielen

int Spielen (int Auswahl, int Lebensenergie); // <- das da weg

{
    // Variablen

Werbeanzeige