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

odc

Frischling

  • »odc« ist der Autor dieses Themas
  • Private Nachricht senden

1

18.11.2006, 16:11

Listing 10.2 (Funktionszeiger)

Hallo community,

ich teste gerade das obige Listing aus und erhalte Fehlermeldungen beim Funktionsaufruf über die Funktionszeiger. Im Listing werden einfach die Werte int a und int b als (Wert1, Wert2) übergeben.

Dies erzeugt allerdings einen Compilerfehler, den ich erst beheben konnte, wenn ich int a und int b als Parameter übergeben habe.

Nun ist ja im Kapitel über Funktionen gesagt worden, dass es ja das besonders Praktische an Funktionen ist, dass man sie aufrufen kann, ohne nun genau zu wissen, wie die Parameter heißen müssen; man ruft vielmehr die korrekte Reihenfolge der Parameter auf und gut ist.

Wie verhält sich das nun bei den Funktionszeigern? Es wäre ja logisch, wenn das hier auch so wäre. Meiner Erfahrung nach (s. oben) ist es aber nicht so.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
------ Erstellen gestartet: Projekt: listing10_2_november06, Konfiguration: Debug Win32 ------
Kompilieren...
listing10_2_november06.cpp
c:\entwicklung\c++\kalista1106\listing10_2_november06\listing10_2_november06\listing10_2_november06.cpp(32) : error C2065: 'Wert1': nichtdeklarierter Bezeichner
c:\entwicklung\c++\kalista1106\listing10_2_november06\listing10_2_november06\listing10_2_november06.cpp(32) : error C2065: 'Wert2': nichtdeklarierter Bezeichner
Das Buildprotokoll wurde unter "file://c:\entwicklung\c++\kalista1106\listing10_2_november06\listing10_2_november06\Debug\BuildLog.htm" gespeichert.
listing10_2_november06 - 2 Fehler, 0 Warnung(en)
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========


Hier wird ja ganz eindeutig gesagt, dass die Bezeichner unbekannt sind.

T-VIRUS

Alter Hase

Beiträge: 548

Wohnort: Göttingen(West)/Nordhausen(Ost)

Beruf: Schüler

  • Private Nachricht senden

2

18.11.2006, 17:40

Zeig mal den src ;)
Ich glaube vllt zuwissen wo der Fehler ist aber ich will keine vorurteiligen schlüße ziehen ;) als pls code =D
Meine Blog:)

Wer Bugs im Text findet kann sie melden, fix erscheint irgendwann :D

MFG T-VIRUS

odc

Frischling

  • »odc« ist der Autor dieses Themas
  • Private Nachricht senden

3

19.11.2006, 12:19

Hallo T-Virus,

hier der Code:

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

//Listing 10_2_november 06

//Funktionszeiger

//

#include <iostream>

using namespace std;

//Prototypen

//

int addieren    (int a, int b);
int multiplizieren (int a, int b);

//Hauptprogramm

//

int main()
{
    //Funktionszeiger

    //

    int (*pFunktion) (int a, int b);

    //Variablen zum Rechnen

    //

    int Ergebnis = 0;
    int a = 3;
    int b = 7;

    //Funktionszeiger auf Funktion "addieren"

    pFunktion = addieren;

    //Funktion "addieren" über Funktionszeiger aufrufen

    Ergebnis = pFunktion (a, b);

    cout << "Ergebnis: " << Ergebnis << endl;

    //Funktionszeiger auf Funktion "multiplizieren"

    pFunktion = multiplizieren;

    //Funktion "multiplizieren" über Funktionszeiger aufrufen

    Ergebnis = pFunktion (a, b);

    cout << "Ergebnis: " << Ergebnis << endl;

    return (0);
}

//Addiere

int addieren(int a, int b)
{
    return (a+b);
}

//MUltiplizieren

int multiplizieren (int a, int b)
{
    return (a*b);
}

Chase

Alter Hase

Beiträge: 753

Wohnort: Nagaoka / Darmstadt / Düsseldorf

Beruf: fauler Studi

  • Private Nachricht senden

4

19.11.2006, 12:56

Hm, das wird wohl irgendwie an der Definition des Funktionspointers liegen, bei mir wird der Code jedoch compiliert. (Auch mit direkter Wertuebergabe) Versuch mal einen Typ fuer den Pointer zu definieren:

C-/C++-Quelltext

1
2
3
typedef int (*Funktion)(int,int);
//Funktionszeiger

Funktion pFunktion;

Keine Ahnung ob das hilft^^
"Have you tried turning it off and on again?"

5

19.11.2006, 14:11

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 10_2_november 06 

//Funktionszeiger 

// 

#include <iostream> 

using namespace std; 

//Prototypen 

// 

int addieren    (int a, int b); 
int multiplizieren (int a, int b); 

//Hauptprogramm 

// 

int main() 
{ 
    //Funktionszeiger 

    // 

    int (*pFunktion) (int a, int b); 

    //Variablen zum Rechnen 

    // 

    int Ergebnis = 0; 
    int a = 3; 
    int b = 7; 

    //Funktionszeiger auf Funktion "addieren" 

    pFunktion = addieren; 

    //Funktion "addieren" über Funktionszeiger aufrufen 

    Ergebnis = pFunktion (a, b); 

    cout << "Ergebnis: " << Ergebnis << endl; 

    //Funktionszeiger auf Funktion "multiplizieren" 

    pFunktion = multiplizieren; 

    //Funktion "multiplizieren" über Funktionszeiger aufrufen 

    Ergebnis = pFunktion (a, b); 

    cout << "Ergebnis: " << Ergebnis << endl; 

    cin.sync();
    cin.get();

    return (0); 
} 

//Addiere 

int addieren(int a, int b) 
{ 
    return (a+b); 
} 

//MUltiplizieren 

int multiplizieren (int a, int b) 
{ 
    return (a*b); 
} 


Bei mir funzt dieser Code wunderbar!
Ich hab lediglich noch ein cin.sync() und ein cin.get() eingefügt!
Das Böse ist des Menschensbeste Kraft - Friedrich Nietzsche

T-VIRUS

Alter Hase

Beiträge: 548

Wohnort: Göttingen(West)/Nordhausen(Ost)

Beruf: Schüler

  • Private Nachricht senden

6

19.11.2006, 15:11

hmm okay zeig mal den original code aus dem Buch ;)
Dort muss der Wurm drin sein =D
Meine Blog:)

Wer Bugs im Text findet kann sie melden, fix erscheint irgendwann :D

MFG T-VIRUS

odc

Frischling

  • »odc« ist der Autor dieses Themas
  • Private Nachricht senden

7

20.11.2006, 20:12

Hallo allerseits,

Chase, Dein Beispiel hat funktioniert... Bloß, warum? Sorry, wenn ich doof frage, aber der Compiler müsste doch eigentlich von sich aus anhand der Reihenfolge der übergebenen Parameter erkennen, welche er benutzen muss. Oder habe ich da was falsch verstanden? was ziemlich wahrscheinlich ist...

Theprogrammer, weshalb hast Du diese beiden Funktionen eingebaut? Ich möchte ja eigentlich bloß zwei Funktionen per Zeiger aufrufen. Da müsste ich doch "eigentlich" nix mit cin.get und cin.sync zu tun bekommen, oder?

T-Virus, der Code ist praktisch identisch mit dem Buch-Beispiel. Ich versuche immer zuerst, diese Beispiele zu schreiben, dann nachzuvollziehen und später experimentiere ich mit ihnen herum. Und scheitere dann kläglich. Jedenfalls müsste das ziemlich exakt der Code sein, den Heiko abgedruckt hat.

Nochmals vielen Dank für eure Hilfe!

T-VIRUS

Alter Hase

Beiträge: 548

Wohnort: Göttingen(West)/Nordhausen(Ost)

Beruf: Schüler

  • Private Nachricht senden

8

21.11.2006, 12:08

Jo freud mich das es funktioniert ;)
Ich hab den src nur überflogen aber eigentlich ist es fast der selbe :p egal ich gucks mir heutenachmittag mal an ;)
Meine Blog:)

Wer Bugs im Text findet kann sie melden, fix erscheint irgendwann :D

MFG T-VIRUS

Chase

Alter Hase

Beiträge: 753

Wohnort: Nagaoka / Darmstadt / Düsseldorf

Beruf: fauler Studi

  • Private Nachricht senden

9

21.11.2006, 12:50

Zitat von »"odc"«

Chase, Dein Beispiel hat funktioniert... Bloß, warum? Sorry, wenn ich doof frage, aber der Compiler müsste doch eigentlich von sich aus anhand der Reihenfolge der übergebenen Parameter erkennen, welche er benutzen muss. Oder habe ich da was falsch verstanden?

Tja, wenn ich das wuesste.. "nichtdeklarierter Bezeichner" also wusste der Compiler nicht, dass Wert1 und Wert2 (7,3) als int zu interpretieren sind. Offensichtlich ist

C-/C++-Quelltext

1
int (*pFunktion) (int a, int b); 
nicht das gleiche wie die Definition eines Prototyps.

Es koennte auch mit der eingestellten calling-convention* zu tun haben:
Diese gibt an, wie die Parameter einer Funktion uebergeben werden (normalerweise per Stack) und wo der returnwert gespeichert wird. ein int add(int a, int b); kann auf mehrere Arten in Maschinencode umgewandelt werden.
Aber ich hoer besser auf vage Andeutungen zu machen und lasse jemandem den Vortritt der da mehr Ahnung hat :) Wie gesagt ich hab keine^^.

*Die kannst du folgendermassen umstellen: Properties -> C++ -> Advanced -> Calling Convention.
"Have you tried turning it off and on again?"

odc

Frischling

  • »odc« ist der Autor dieses Themas
  • Private Nachricht senden

10

22.11.2006, 21:25

Hallo Chase, hallo T-Virus,

danke nochmals für eure Hilfe... Langsam nähert sich meine Reise durch Heikos Buch dem Ende und ich hab das Gefühl, dass ich nichts gelernt habe... :(
Ich kenne das Phänomen aus meiner Zeit, als ich der schnellste Gitarrist der Welt werden wollte. Ist nicht ganz gelungen... Ebenfalls: :(

Dennoch, vielen Dank - das Board hier rockt.
code is poetry

Werbeanzeige