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...
    🙂


Anmelden zum Antworten