warning: implicit declaration of function
-
Folgendes Programm habe ich begonnen zu schreiben:
#include <stdio.h> #include <stdlib.h> #include <math.h> int main( int argc , char* argv[] ) { if( argc < 2 ) { printf("Error: Use to call: StockMarket [runs] [drift_mean]."); exit(0); } int runs = atoi( argv[1] ); double drift_mean = atof( argv[2] ); } void simulation( int runs , double drift_mean ) { for( int i = 0 ; i < runs ; ++i ) { perform_a_movement(); } } int time_to_next_drift_calculation = 0; int time_mean = 2000; void perfrom_a_movement() { if( time_to_next_drift_calculation == 0 ) { time_to_next_drift_calculation = get_new_random_time( time_mean ); //get new external drift } time_to_next_drift_calculation--; } int get_new_random_time( int time_mean ) { return (int) inverse_exp_distribution( time_mean ); } double inverse_exp_distribution( double mean ) { return -mean * log( 1 - next_double() ); } double next_double() { return ( (double) rand() / ( (double) (RAND_MAX) + (double) (1) ) ) }
Allerdings erhalte ich folgende Fehlerausgabe:
~/Eigene_Dateien/Programmieren/C toom$ gcc -std=c99 Test.c -o TestTest.c: In function 'simulation': Test.c:21: warning: implicit declaration of function 'perform_a_movement' Test.c: In function 'perfrom_a_movement': Test.c:33: warning: implicit declaration of function 'get_new_random_time' Test.c: In function 'get_new_random_time': Test.c:42: warning: implicit declaration of function 'inverse_exp_distribution' Test.c: At top level: Test.c:45: error: conflicting types for 'inverse_exp_distribution' Test.c:42: error: previous implicit declaration of 'inverse_exp_distribution' was here Test.c: In function 'inverse_exp_distribution': Test.c:46: warning: implicit declaration of function 'next_double' Test.c: At top level: Test.c:49: error: conflicting types for 'next_double' Test.c:46: error: previous implicit declaration of 'next_double' was here Test.c: In function 'next_double': Test.c:51: error: parse error before '}' token
Verstehen tue ich von diesen Meldungen leider keine.
-
Bevor Du eine Funktion aufrufst, mußt Du sie vor definieren oder zumindest durch einen Prototypen deklarieren.
void DoSomething(void); /* Kein Parameter: void erforderlich */ void DoSomething(void); /* 2 mal ist auch ok */ int DoSomething2(int zahl) /* vorher definiert */ { return zahl; } int main() /* Ausnahme: bei main kann die Klammer leer bleiben */ { DoSomething(); /* Kein Parameter, Deklaration steht oben */ DoSomething2(1); /* Definition steht oben */ return 0; } /* danach definiert */ void DoSomething(void) /* Kein Parameter: void erforderlich */ { printf("Schweine im Weltall\n"); }
-
oder alle funktionen vor die main() packen. erspart buchhaltung von prototypen.
-
c.rackwitz schrieb:
alle funktionen vor die main() packen.
Genau. Ich denke, so machen es die meisten.
-
keksekekse schrieb:
Bevor Du eine Funktion aufrufst, mußt Du sie vor definieren oder zumindest durch einen Prototypen deklarieren.
Jein. Bei C89 und K&RC muss man das nicht machen, da wird implizit int Angenommen für den Rückgabetyp und die Parameter. Aber das kann natürlich zu unangenehmen Fehlern führen, wenn man einen Typ T mit sizeof(T) != sizeof(int) hat
-
rüdiger schrieb:
keksekekse schrieb:
Bevor Du eine Funktion aufrufst, mußt Du sie vor definieren oder zumindest durch einen Prototypen deklarieren.
Jein. Bei C89 und K&RC muss man das nicht machen, da wird implizit int Angenommen für den Rückgabetyp und die Parameter. Aber das kann natürlich zu unangenehmen Fehlern führen, wenn man einen Typ T mit sizeof(T) != sizeof(int) hat
also besser doch immer machen...