Arten von Funktionimplementierungen



  • Ich habe im folgenden zwei funktionen mit dem selben Bezeichner implementiert. Gibt es da Unterschiede beim Funktionsaufruf?

    /* Variante 1 */
    void superfunction(double x[], double y[])
    {
    	printf("42");
    }
    
    /* Variante 2 */
    superfunction(x,y) double x[],y[]; /* Geht das auch so ?? */
    {
    	printf("42");
    }
    

    Wäre nett, wenn jemand zur Variante 2 was sagen würde. Also ob das auch funktioniert. Danke



  • ^^das zweite ist uralt-syntax und geht heute nicht mehr.
    🙂



  • EDIT: Ok ich nehm den Beitrag zurück...

    😉



  • dachte, die uralte ist so:

    /* Variante 3 */ 
    superfunction()
    {
        double *x,*y;
        printf("42"); 
    }
    

    ich leg mir einfach zwei lokale vars an und die sind offiziell undefiniert, aber OH ZUFALL ABER AUCH, hat der aufrufer beim auf-den-stack-schubsen genau da schon werte reingeschrieben, die ich genau da auch brauchen tue.



  • +fricky du hast mir schon wieder geholfen 🙂 danke auch alle anderen auch. ich kenne dieses forum schon seit jahren. aber so richtig hatte ich es nicht benutzt. werde in zukunft das ändern.

    zum thema. was meinst du mit die uralt syntax geht nicht ? denn, ich habe es kompiliert und es läuft...



  • Eclipse++ schrieb:

    zum thema. was meinst du mit die uralt syntax geht nicht ? denn, ich habe es kompiliert und es läuft...

    Mit welchem Compiler denn?



  • volkard schrieb:

    dachte, die uralte ist so:

    /* Variante 3 */ 
    superfunction()
    {
        double *x,*y;
        printf("42"); 
    }
    

    die kenne ich gar nicht. ich kenne nur noch diese variante:

    square(x)
    {
        return x*x;
    }
    

    ^^dabei wird angenommen, dass x ein 'int' ist, und die funktion einen 'int' zurückgibt, wenn kein typ hingeschrieben wird.
    🙂



  • volkard schrieb:

    dachte, die uralte ist so:

    /* Variante 3 */ 
    superfunction()
    {
        double *x,*y;
        printf("42"); 
    }
    

    Gibt es zwischen der neuen und der uralten noch die "alte"?

    Wenn nicht, würde ich nämlich behaupten, dass das da oben tatsächlich nur durch PUREN ZUFALL funktionierte und nicht offiziell zu C gehörte.



  • _matze schrieb:

    Eclipse++ schrieb:

    zum thema. was meinst du mit die uralt syntax geht nicht ? denn, ich habe es kompiliert und es läuft...

    Mit welchem Compiler denn?

    gcc 4.x das ist nicht uralt 🙂



  • LordJaxom schrieb:

    würde ich nämlich behaupten, dass das da oben tatsächlich nur durch PUREN ZUFALL funktionierte und nicht offiziell zu C gehörte.

    ich glaube, dem kann ich mich anschließen,. auch wenn der zufall ein wenig unpur ist und K&R-C nicht durch einen abstrakten standard definiert war, sondern durch einen referenzcompiler, der's genauso machte.



  • volkard schrieb:

    /* Variante 3 */ 
    superfunction()
    {
        double *x,*y;
        printf("42"); 
    }
    

    ich leg mir einfach zwei lokale vars an und die sind offiziell undefiniert, aber OH ZUFALL ABER AUCH, hat der aufrufer beim auf-den-stack-schubsen genau da schon werte reingeschrieben, die ich genau da auch brauchen tue.

    Bist du dir da 100% sicher? Wenn nicht, würde ich sagen, das ist Unfug.



  • Bashar schrieb:

    volkard schrieb:

    /* Variante 3 */ 
    superfunction()
    {
        double *x,*y;
        printf("42"); 
    }
    

    ich leg mir einfach zwei lokale vars an und die sind offiziell undefiniert, aber OH ZUFALL ABER AUCH, hat der aufrufer beim auf-den-stack-schubsen genau da schon werte reingeschrieben, die ich genau da auch brauchen tue.

    Bist du dir da 100% sicher? Wenn nicht, würde ich sagen, das ist Unfug.

    ich hab das mal geschieben und da klappte es. ist aber schon länger her.
    der aktuelle gcc frisst es nicht.
    also isses wohl unfug.



  • Also im K&R I steht die hier zuerst als "uralt" bezeichnete Variante drin. Sogar in B musste man schon die Parameter in den Klammern angeben.



  • ich hab das mal geschieben und da klappte es. ist aber schon länger her.

    Das bedeutet garnichts ... (glaub mir).

    pointer get_cell(a, b)
    register pointer a, b;
    {
       ...
       return (x);
    }
    

    Funktioniert. Die Funktion muss nichtmal einen Rueckgabewert spezifiziert haben. (pointer ist nen typedef)


Log in to reply