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

TigerClaw25

unregistriert

11

26.07.2017, 13:19

Ok, ich verstehe es jetzt, aber sollte "static SDL_AudioSpec wav_spec;" nicht mit einem Sternchen sein?

Beispiel:

C-/C++-Quelltext

1
2
3
4
5
6
7
void foo(){} // Funktion

int main(){
int *ptr;   //Zeiger auf Funktion
ptr=foo;
return 0;
}


Die Struktur "wav_spec" ist nicht als Zeiger deklariert. Das verstehe ich nicht.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

12

26.07.2017, 14:12

int *ptr kannst du keinen Zeiger auf eine Funktion zuweisen! Das ist ein Zeiger auf einen int. Selbst wenn die Funktion als Rückgabetyp int hätte, ginge das nicht. Eine Funktion ist eine Funktion und nicht das, was sie zurückgibt. Lies bitte die Artikel, die du selbst verlinkt hast!

13

26.07.2017, 14:28

wav_spec ist eine Instanz der Struktur SDL_AudioCallback. Die hat verschiedene Member, unter anderem 'callback'. Auf 'callback' greifst du wie üblich mit einem Punkt zu. 'callback' ist vom Datentyp 'SDL_AudioCallback'. 'SDL_AudioCallback' ist als Datentyp ein Zeiger auf eine Funktion mit der Signatur void(void*, Uint8*, int). Somit kann 'callback' einen Zeiger auf eine Funktion mit einer solchen Signatur halten.


Der Datentyp, der bei einer Variablendeklaration angegeben wird, muss kein Sternchen enthalten, um die Variable als einen Zeiger zu markieren:

C-/C++-Quelltext

1
2
3
4
typedef int* intzeiger; //intzeiger ist ein synonym für int*, einen Datentyp, der auf ints zeigen kann
intzeiger einzeiger; //einzeiger ist int intzeiger, also ein int*.

intzeiger *einzweiterzeiger; //ein zeiger, der auf zeiger auf ints zeigen kann: int**

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Techel« (26.07.2017, 14:35)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

14

26.07.2017, 14:30

Funktionen haben natürlich einen eigenen Datentyp und damit auch einen eigenen Pointer-Typ. Die Typ-Deklaration von Pointer in C/C++ ist total hässlich (sowas wie
"void(*myFunction)(void*, Uint8*, int)"
). Minimal hübscher ist das mit C++11:
std::function<void(void*, Uint8*, int)> myFunction;
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

TigerClaw25

unregistriert

15

26.07.2017, 15:56

int *ptr kannst du keinen Zeiger auf eine Funktion zuweisen! Das ist ein Zeiger auf einen int. Selbst wenn die Funktion als Rückgabetyp int hätte, ginge das nicht. Eine Funktion ist eine Funktion und nicht das, was sie zurückgibt. Lies bitte die Artikel, die du selbst verlinkt hast!


Das heißt, wenn ich eine Funktion wie "int foo()" habe, kann ich erst dann die Zuweisung "ptr=foo();", wenn ich etwas in der Art "int (*ptr) (Parameterdatentypen)" durchgeführt habe?!

Ach stimmt, wenn ich nämlich nur "int *ptr (int x, int y)" schreiben würde, würde es eher einem Prototypen einer Funktion gleich kommen. Eventuell sollte ich mir für einfache Pointer auf Variablen die Schreibweise "int* ptr" statt "int *ptr" aneignen, dann wird das Sternchen bei Funktionszeigern "int (*ptr)" deutlicher :D :D

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

16

26.07.2017, 16:00

Das heißt, wenn ich eine Funktion wie "int foo()" habe, kann ich erst dann die Zuweisung "ptr=foo();", wenn ich etwas in der Art "int (*ptr) (Parameterdatentypen)" durchgeführt habe?!

Nein, hier rufst du die Funktion auf. Damit wäre das ein int, den du versuchst einem Funktionszeiger zuzuweisen. Die Klammern musst du weglassen. ptr = foo oder auch ptr = &foo, beides geht.

Eventuell sollte ich mir für einfache Pointer auf Variablen die Schreibweise "int* ptr" statt "int *ptr" aneignen, dann wird das Sternchen bei Funktionszeigern "int (*ptr)" deutlicher :D :D

Diese Schreibweise benutze ich auch. Solange man nicht mehrere Zeiger in einem Rutsch deklarieren möchte, ist das OK. Das Problem ist nämlich: Wenn du int* a, b, c schreibst, dann ist nur a ein Zeiger.

TigerClaw25

unregistriert

17

26.07.2017, 16:29


wav_spec ist eine Instanz der Struktur SDL_AudioCallback. Die hat verschiedene Member, unter anderem 'callback'. Auf 'callback' greifst du wie üblich mit einem Punkt zu. 'callback' ist vom Datentyp 'SDL_AudioCallback'. 'SDL_AudioCallback' ist als Datentyp ein Zeiger auf eine Funktion mit der Signatur void(void*, Uint8*, int). Somit kann 'callback' einen Zeiger auf eine Funktion mit einer solchen Signatur halten.



Ein Blick in die Header hilft da auch: "typedef void (SDLCALL * SDL_AudioCallback) (void *userdata, Uint8 * stream,
int len);"

Für mich als Anfänger ist die Schreibweise bzw. die Typendefinition nicht wirklich zu 100% einleuchtend, aber das ist nach gerade einmal 4 Wochen normal. Aber zumindest weiß ich, dass "want.callback" im Prinzip nichts anderes ist wie "*(want.callback)", wenn der Datentyp nicht als Zeiger deklariert worden wäre. IM Prinzip eine Vereinfachung, um nicht mit dem Sternchenoperator arbeiten zu müssen, oder?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

18

26.07.2017, 16:33

Aber zumindest weiß ich, dass "want.callback" im Prinzip nichts anderes ist wie "*(want.callback)", wenn der Datentyp nicht als Zeiger deklariert worden wäre. IM Prinzip eine Vereinfachung, um nicht mit dem Sternchenoperator arbeiten zu müssen, oder?

Hä? Sicher, dass du das geschrieben hast, was du meinst?

TigerClaw25

unregistriert

19

27.07.2017, 07:39

(SDLCALL * SDL_AudioCallback) (void *userdata, Uint8 * stream, int len);

Ist mein Typenbezeichner. Und die Struktur "SDL_AudioSpec" enthält als Element unter anderem "SDL_AudioCallback callback". Das heißt, dass "callback" mein Zeiger auf eine Funktion ist. SDL_AudioCallback ist ja der Typ-Alias.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

20

27.07.2017, 09:20

Richtig.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige