Aufgabe mit Pointer auf Funktion
-
Schreib dir 2 Funktionen und lass abhängig von der Eingabe (bei dir x) den Funktionszeiger auf eine der beiden Funktionen zeigen und ruf dann die Funktion (durch Dereferenzierung des Funktionszeigers) auf.
Wie genau Funktionszeiger funktionieren musste dafür erstmal garnicht wissen, es reicht wenn du dir einfach die Syntax von irgend nem Tutorial kopierst (functionpointer.com etc)
-
Ich würd' eher ein Array aus den Funktionszeigern basteln:
#include <stdio.h> #define _USE_MATH_DEFINES /* ISO/IEC 9899/1999 verlangt M_PI nicht zwingend -> Compilererweiterung */ #include <math.h> void flush_stdin( void ) { int ch; while( ( ( ch = getc( stdin ) ) != EOF ) && ( ch != '\n' ) ); } double get_outline( float radius ) { return 2.0f * radius * M_PI; } double get_area( float radius ) { return radius * radius * M_PI; } struct function_switch_t { const char *name; double ( *function )( float ); } function_switch[ ] = { { "Der Umfang", get_outline }, { "Die Flaeche", get_area } }; int main( void ) { float radius = 0.0f; int choice = 0; do { puts( "Bitte geben Sie einen Radius ein:" ); if( !scanf( "%f", &radius ) ) { puts( "Eingabefehler!\n" ); flush_stdin( ); radius = 0; } } while( !radius ); do { puts( "\nBitte waehlen Sie:" ); puts( " 1 ... Umfang" ); puts( " 2 ... Flaeche" ); if( !scanf( "%d", &choice ) && ( choice != 1 ) && ( choice != 2 ) ) { puts( "Eingabefehler!" ); flush_stdin( ); choice = 0; } } while( !choice ); printf( "\n%s eines Kreises mit Radius %f ist %lf.\n", function_switch[ choice - 1 ].name, radius, function_switch[ choice - 1 ].function( radius ) ); }
greetz, Swordfish
-
Gewaltig!!
Danke für deine Hilfe Swordfish!
glg fath
-
Hast Du es auch verstanden?
greetz, Swordfish
-
Nun ja, teilweise.
Ein paar Sachen werde ich umschreiben müssen.
Ich habe noch nicht herausgefunden, warum du den ! Operator benutzt (z.B. vor scanf oder radius)
while( ( ( ch = getc( stdin ) ) != EOF ) && ( ch != '\n' ) ); Die Bedingung in dieser while Schleife ist auch noch nicht ganz klar für mich.
Auch struct habe ich noch nicht kennen gelernt.
Vielleicht hast du ja noch ein paar kurze Erklärungen? Sonst muss ich mich noch durch den Tutorials-Jungle kämpfen.
Danke inzwischen!!
lg fath
-
Die Funktion
flush_stdin
ist nur dazu da, ungültige Eingaben aus dem Puffer vonstdin
zu flushen. Man hätte auch schreiben können:void flush_stdin( void ) { int ch = 0; do { ch = getc( stdin ); } while( ( ch != '\n' ) && ( ch != EOF ) ); // oder: while( !( ( ch == '\n' ) || ( ch == EOF ) ) ); }
Es werden also Zeichen aus
stdin
gelesen (entfernt), solange (a) der stream nicht leer ist (EOF
) und das Ende der Zeile ('\n'
) nicht erreicht ist.Ich habe Funktionen und deren Namen in eine
struct
zusammengefasst. Du kannst sie natürlich auch getrennt lassen:// anstatt: struct function_switch_t { const char *name; double ( *function )( float ); } function_switch[ ] = { { "Der Umfang", get_outline }, { "Die Flaeche", get_area } }; // definierst du am beginn der main einfach: double ( *function_switch[ ] )( float ) = { get_outline, get_area }; const char *name[ ] = { "Der Umfang", "Die Flaeche" }; // und berechnest so: printf( "\n%s eines Kreises mit Radius %f ist %lf.\n", name[ choice - 1 ], radius, function_switch[ choice - 1 ]( radius ) );
fath schrieb:
Ich habe noch nicht herausgefunden, warum du den ! Operator benutzt (z.B. vor scanf oder radius)
C nimmt 0 als
false
und alles andere alstrue
an. Wenn jetzt inradius
0
steht (d.h. keine gültige Eingabe erfolgt ist), sag ichwhile( !radius );
. Du könntest auchwhile( radius != 0 );
schreiben.Ich hoffe, nun sind alle Klarheiten beseitigt
greetz, Swordfish
-
Swordfish schrieb:
Die Funktion
flush_stdin
ist nur dazu da, ungültige Eingaben aus dem Puffer vonstdin
zu flushen.ja fein, aber 'flush' ist hier nur das falsche wort.
-
Warum?
greetz, Swordfish
-
im zusammenhang mit irgendwelchen buffern heisst flush soviel wie: 'alle gepufferten daten jetzt sofort an den empfänger senden'. die daten gehen dabei nicht verloren, sondern werden für die sofortige weiterverarbeitung aus dem buffer rausgeschoben. was du aber machst ist eher 'auslesen und wegwerfen'. hier wäre vielleicht 'clear' oder sowas das passendere wort.
-
to flush = "leeren" Punktum
greetz, Swordfish
-
Swordfish schrieb:
to flush = "leeren"
naja sagen wir's mal so: wenn du das glas bier auf 'ex' austrinkst ist das ein 'flush'. kippst du es in den ausguss, dann nicht.
-
Wenn ich ein Bier wegkippe, so ist das a) Verschwendung und b) nicht ich.
greetz, Swordfish