Allgemeine Frage zu Funktionen



  • Hallo,

    ich hab eine allgemeine Frage zu Funktionen in C.

    Folgende Beispiel-Funktion:

    funk(int a, int b, int c)
    {
    	if(b == 1)
    	{
    		//Mach was
    	}
    	if(b == 2)
    	{
    		//Mach was
    	}
    	if(b == 3)
    	{
    		If(a == 8)
    		{
    funk (int a, 2, int c) //ich rufe in der Funktion funk die Funktion selber   auf aber mit anderen Paramter.
    		}		
    
    	}
    

    }



  • sry, der obere Beitrag war noch nicht fertig und ich hab in ausversehen gepostet.

    Hier was ich eigentlich fragen wollte:

    Hallo,

    ich hab eine allgemeine Frage zu Funktionen in C.

    Folgende Beispiel-Funktion:

    funk(int a, int b, int c)
    {
    	if(b == 1)
    	{
    		//Mach was
    	}
    	if(b == 2)
    	{
    		//Mach was
    	}
    	if(b == 3)
    	{
    		If(a == 8)
    		{
                         funk(int a, 2, int c); //ich rufe die Funktion funk in   
                                                //sich selber auf aber mit 
                                                //andernen Parameter.
    
    		}		
    
    	}
    
    }
    

    Meine Frage jetzt.
    Ist es in C möglich eine Funktion in sich selber aufzurufen, aber mit anderen Parameter?

    Schon mal danke für eure Antworten.



  • ja das ist natürlich möglich, nur solltest du auch zusehen, daß sie es irgendwann sein lässt, sonst schießt sie dir dein programm ab 🤡



  • Ja, sogar mit denselben Parametern. Stichwort Rekursion.

    Bei dir ist da ein Syntaxfehler, dein Funktionsaufruf sieht aus wie eine Deklaration. Du willst wahrscheinlich

    funk(a, 2, c);
    

    schreiben.



  • Bashar schrieb:

    Ja, sogar mit denselben Parametern. Stichwort Rekursion.

    Bei dir ist da ein Syntaxfehler, dein Funktionsaufruf sieht aus wie eine Deklaration. Du willst wahrscheinlich

    funk(a, 2, c);
    

    schreiben.

    Ja wollte ich schreiben.

    Ok danke.



  • real_rofler schrieb:

    ja das ist natürlich möglich, nur solltest du auch zusehen, daß sie es irgendwann sein lässt, sonst schießt sie dir dein programm ab 🤡

    Wie meinst du das? Warum sollte mir die Funktion mein Programm abschießen.
    Könntest du das bitte etwas näher erklären?
    Danke



  • Er meint wohl, dass du eine Abbruchbedingung haben solltest, da sich die Funktion sonst endlos aufruft, bis der Arbeitsspeicher gefüllt ist.



  • Slayer schrieb:

    Wie meinst du das? Warum sollte mir die Funktion mein Programm abschießen.
    Könntest du das bitte etwas näher erklären?
    Danke

    Noch zusaetzlich schaue das an:

    #include <stdlib.h>
    #include <stdio.h>
    
    /* rekursive addition zwischen a und 10*/ 
    int recurse_me(int a){
    
        if(a < 10 )
            return (a + recurse_me(a+1)) ; /* ruft sich selber auf */
        else
            return 10 ;     /* Abbruchbedingung */
    }
    
    int main(void){
    
        int a = 5, result ;
        result = recurse_me(a);
    
        fprintf(stdout, "Ergebnis ist:%d\n",result) ;
    
    return 0;
    }
    

    Gruss,



  • sry, das ich noch mal nachfrage, aber ich kann nicht nachvollziehen war die Funktion mein Programm anschießen soll. Ich hab mal schnell einen kleines Testprogramm geschrieben.

    # include <stdio.h>
    # include <stdlib.h>
    
    void funk(int a, int b, int c);
    
    int main(void)
    {
    printf("Vor der Funktion \n");
    funk(8,3,5);
    printf("Nach der Funktion \n");
    getche();
    return 0;	
    
    }
    
    void funk(int a, int b, int c) 
    { 
        if(b == 1) 
        { 
            printf("1\n");
        } 
        if(b == 2) 
        { 
            printf("2\n");
        } 
        if(b == 3) 
        { 
            if(a == 8) 
            { 
    					printf("a8 und b3 vor funktion\n");
                        funk(1 , 2, 1); 
                        printf("a8 und b3 nach funktion\n");
    		}        
    
        } 
    
    }
    

    Ausgabe:

    Vor der Funktion
    a8 und b3 vor funktion
    2
    a8 und b3 nach funktion
    Nach der Funktion

    Klappt alles ohne Problem.
    Könntet ihr mir daher bitte noch mal erklären, warum die Funktion mein Programm abschießt könnte/müsste/sollte?
    Danke



  • Slayer schrieb:

    sry, das ich noch mal nachfrage, aber ich kann nicht nachvollziehen war die Funktion mein Programm anschießen soll. Ich hab mal schnell einen kleines Testprogramm geschrieben.

    Nicht die Funktion. Du hast hoffentlich nicht nach dieser Funktion, sondern nach dem allgemeinen Prinzip gefragt 😉 Mach doch mal folgendes:

    void funk() {
      funk();
    }
    

    (Im Zweifelsfall ohne Compileroptimierungen übersetzen!)

    Für jede Aktivierung (Rücksprungadresse, Parameter, lokale Variablen) einer Funktion wird ein Stück Speicher auf dem Stack belegt. Ab einer bestimmten Aufruftiefe ist der Stack dann voll und böse Dinge passieren. Man muss also darauf achten, dass die Abbruchbedingungen bei Rekursionen korrekt sind. Zusätzlich sollte man auch noch sicherstellen, dass die Rekursionstiefe auch regulär noch im Rahmen bleibt.



  • Bashar schrieb:

    Slayer schrieb:

    sry, das ich noch mal nachfrage, aber ich kann nicht nachvollziehen war die Funktion mein Programm anschießen soll. Ich hab mal schnell einen kleines Testprogramm geschrieben.

    Nicht die Funktion. Du hast hoffentlich nicht nach dieser Funktion, sondern nach dem allgemeinen Prinzip gefragt 😉 Mach doch mal folgendes:

    void funk() {
      funk();
    }
    

    (Im Zweifelsfall ohne Compileroptimierungen übersetzen!)

    Für jede Aktivierung (Rücksprungadresse, Parameter, lokale Variablen) einer Funktion wird ein Stück Speicher auf dem Stack belegt. Ab einer bestimmten Aufruftiefe ist der Stack dann voll und böse Dinge passieren. Man muss also darauf achten, dass die Abbruchbedingungen bei Rekursionen korrekt sind. Zusätzlich sollte man auch noch sicherstellen, dass die Rekursionstiefe auch regulär noch im Rahmen bleibt.

    Wenn ich

    void funk() {
      funk();
    }
    

    schreib ist schon klar das mein Progamm abstürtz, da sich die Funktion ja immer wieder selber aufruft.

    Dann hatte ich mich am Anfang anscheinend nicht richtig ausgedrückt.

    Danke für eure vielen schnellen Antworten 👍


Anmelden zum Antworten