Zeiger Wert zurückgeben



  • DirkB schrieb:

    Die Funktion soll das alles überprüfen.
    Ein Rückgabewert wird nicht dadurch zum Rückgabewert, dass man ihn rueck nennt.
    Wozu hast du denn die Zeilen 27 bis 30?
    Dann schau noch mal in deinen Unterlagen nach.
    Bei printf ist der Formatspecifier %f für float und double . Oft wird bei double %lf genommen, da dies bei scanf so ist.
    Und %d steht für dezimal int. Wenn du da eine double-Variable angibst, kommt Mist raus.

    Ich muss die funktion doch mit etwas "füttern" damit sie mir wiederrum etwas ausspuckt?! Deshalbt auch die Zeilen 27-30...da definiere ich was in der Matrix ein a,b,c,d ist, sonst weiß das programm ja nicht was in der Matrix welchen Wert hat bzw. versuch dann auch in der Funktion dies so hin zu schreiben...
    Das mit dem fl bzw. lf hast recht gehabt! Genau deswegen bin ich hier..immer was neuen bzw. aus fehlern lernen 🙂

    Handwerker2013 schrieb:

    Wenn du die globale Matrix nutzt, dann musst du der Funktion das nicht "sagen". Willst du aber mit einer x-beliebigen 2x2 Matrix in deiner Funktion arbeitet, so erweitere deine Argumente einfach um eine 2x2Matrix des Typs double, also z.B so:

    Das habe ich mir auch überlegt ABER ich darf die Funktion nicht ändern bedeutet ich muss bei

    int eigen(double *e1, double *e2)
    

    bleiben

    Oh man, hab mir das alles einfacher Vorgestellt 😃



  • Du schreibst die Werte von a b c d in die Matrix. Dann sind die da drin.
    Was meinst du, auf was die Funktion dann zugreift?
    Auf die Elemente der Matrix. Und da stehen die Werte drin.
    (Du hast ha eine globale Matrix. Die ist von überall sichtbar)



  • Na dann benutze halt weiter die globale Matrix, wenn die Vorgabe da keinen Spielraum lässt. Warum machst du eigentlich aus dem hier:

    if (uwurzel > 0)
        {
            rueck=1;
        }
        else
        {
            rueck=0;
        }
    
        if (rueck=1)
        {
            eigen(&E1, &E2);
            printf("Eigenwert1= %.1d\nEigenwert2= %.1d\n", E1, E2);
        }
        else
        {
            printf("Eigenwert konnte nicht berechnet werden!\n");
        }
    

    nicht das?

    if (uwurzel > 0)
        {
            eigen(&E1, &E2);
            printf("Eigenwert1= %.1d\nEigenwert2= %.1d\n", E1, E2);
        }
        else
        {
            printf("Eigenwert konnte nicht berechnet werden!\n");
        }
    


  • Dabei fällt mir gerade auf, dass du bestimmt:

    if (rueck == 1)
    

    anstellen von

    if (rueck=1)
    

    schreiben wolltest.



  • Suuuuper habs hinbekommen. Jetzt klappts.
    Danke für die Hilfe!!! 🙂

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <math.h> 
    
    double x[2][2];
    
    int eigen(double *e1, double *e2)
    {
    	int uwurzel, rueck;
    
    	uwurzel = ((x[1][1] + x[0][0] / 2.0) * (x[1][1] + x[0][0] / 2.0) + (x[1][0] * x[0][1]) - (x[0][0] * x[1][1]));
    	if (uwurzel > 0)
    	{
    		*e1 = (((x[1][1] + x[0][0]) / 2) + (sqrt((((x[1][1] + x[0][0]) / 2) * ((x[1][1] + x[0][0]) / 2)) + (x[1][0] * x[0][1]) - (x[0][0] * x[1][1]))));
    		*e2 = (((x[1][1] + x[0][0]) / 2) - (sqrt((((x[1][1] + x[0][0]) / 2) * ((x[1][1] + x[0][0]) / 2)) + (x[1][0] * x[0][1]) - (x[0][0] * x[1][1]))));
    	}
    	else
    	{
    		return 0;
    	}
    }
    
    void main(void)
    {
    	double a, b, c, d, E1, E2;
    	int rueck, uwurzel, eigen(E1, E2);
    	time_t t;
    
    	time(&t);
    	srand((unsigned int)t);
    	a = rand() % 100;
    	b = rand() % 100;
    	c = rand() % 100;
    	d = rand() % 100;
    
    	x[0][0] = a;
    	x[0][1] = b;
    	x[1][0] = c;
    	x[1][1] = d;
    
    	eigen(&E1, &E2);
    	printf("Eigenwert1= %.1lf\nEigenwert2= %.1lf\n", E1, E2);
    	return 0;
    }
    


  • Handwerker2013 schrieb:

    Warum machst du eigentlich aus dem hier:
    nicht das?

    Weil das nicht im Sinne der Aufgabe ist.

    Du wertest den Rückgabewert von eigen nicht aus.

    Den Umweg über a, b, c, d musst du auch nicht gehen.

    Warum schreibst du nicht sqrt(uwurzel) ?
    Und bist du sicher, das du mit dem Typ für uwurzel richtig liegst?

    Die Deklaration von eigen gehört auch nicht in main .



  • Du wertest den Rückgabewert von eigen nicht aus.

    Den Umweg über a, b, c, d musst du auch nicht gehen.

    Warum schreibst du nicht sqrt(uwurzel) ?
    Und bist du sicher, das du mit dem Typ für uwurzel richtig liegst?

    Die Deklaration von eigen gehört auch nicht in main .

    Wie meinst du das mit dem Auswerten des Rückgabewertes von eigen? Was wäre der Lösungsvorschlag?
    Den Umweg über a,b,c,d....was wäre der kürzere Weg?
    Stimmt die Deklaration von eigen hab ich rausgenommen aus main() und von int uwurzel habe ich ein double uwurzel gemacht wobei ich denke das das egal ist da ich nur schauen will ob uwurzel negative ist oder nicht.
    Warum ich nicht sqrt(uwurzel) schreibe ist, dass mich der Wurzelwert nicht interessiert sondern nur das, was unter der Wurzel steht.



  • Na sowas hier:

    if(eigen(&E1, &E2))
        printf("Eigenwert1= %.1lf\nEigenwert2= %.1lf\n", E1, E2);
    else
       printf("Fehlermeldung\n");
    


  • Ich habe es nicht getestet:

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <math.h>
    
    double x[2][2];
    
    int eigen(double *e1, double *e2)
    {
        int uwurzel = ((x[1][1] + x[0][0] / 2.0) * (x[1][1] + x[0][0] / 2.0) + (x[1][0] * x[0][1]) - (x[0][0] * x[1][1]));
        if (uwurzel > 0)
        {
            *e1 = (((x[1][1] + x[0][0]) / 2) + (sqrt((((x[1][1] + x[0][0]) / 2) * ((x[1][1] + x[0][0]) / 2)) + (x[1][0] * x[0][1]) - (x[0][0] * x[1][1]))));
            *e2 = (((x[1][1] + x[0][0]) / 2) - (sqrt((((x[1][1] + x[0][0]) / 2) * ((x[1][1] + x[0][0]) / 2)) + (x[1][0] * x[0][1]) - (x[0][0] * x[1][1]))));
        	return 1;
        }
        else
        {
            return 0;
        }
    }
    
    void main(void)
    {
        double E1, E2;
        time_t t;
    
        time(&t);
        srand((unsigned int)t);
    
        x[0][0] = rand() % 100;
        x[0][1] = rand() % 100;
        x[1][0] = rand() % 100;
        x[1][1] = rand() % 100;
    
        if (eigen(&E1, &E2))
        	printf("Eigenwert1= %.1lf\nEigenwert2= %.1lf\n", E1, E2);
        else
        	printf("Fehlermeldung\n);
    
        return 0;
    }
    


  • double uwurzel = ((x[1][1] + x[0][0] / 2.0) * (x[1][1] + x[0][0] / 2.0) + (x[1][0] * x[0][1]) - (x[0][0] * x[1][1]));
        if (uwurzel > 0)
        {
            *e1 = (((x[1][1] + x[0][0]) / 2) + sqrt(uwurzel)); // da war es gemeint
            *e2 = (((x[1][1] + x[0][0]) / 2) - sqrt(uwurzel)); // und hier auch
    

    Und noch ein paar Kleinigkeiten:

    int main(void)  // main gibt ein int zurück. Immer
    {
        double E1, E2;
    
        srand(time(NULL));  // reicht
    ...
       printf("Eigenwert1= %.1f\nEigenwert2= %.1f\n", E1, E2);  // Wie schon gesagt: %f (ohne l) ist für double und float
    ...
    


  • Na, dann fasse ich mal als Handwerker zusammen(ungetestet):

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <math.h>
    
    double x[2][2];
    
    int eigen(double *e1, double *e2)
    {
        double uwurzel = ((x[1][1] + x[0][0] / 2.0) * (x[1][1] + x[0][0] / 2.0) + (x[1][0] * x[0][1]) - (x[0][0] * x[1][1]));
        if (uwurzel > 0)
        {
            *e1 = (((x[1][1] + x[0][0]) / 2) + sqrt(uwurzel));
            *e2 = (((x[1][1] + x[0][0]) / 2) - sqrt(uwurzel));
            return 1;
        }
        else
        {
            return 0;
        }
    }
    
    int main()
    {
        double E1, E2;
        srand(time(NULL));
    
        x[0][0] = rand() % 100;
        x[0][1] = rand() % 100;
        x[1][0] = rand() % 100;
        x[1][1] = rand() % 100;
    
        if (eigen(&E1, &E2))
        	printf("Eigenwert1= %.1f\nEigenwert2= %.1f\n", E1, E2); 
    
        else
            printf("Fehlermeldung\n);
    
        return 0;
    }
    


  • Schreibfehler korrigiert(ungetestet):

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <math.h>
    
    double x[2][2];
    
    int eigen(double *e1, double *e2)
    {
        double uwurzel = ((x[1][1] + x[0][0] / 2.0) * (x[1][1] + x[0][0] / 2.0) + (x[1][0] * x[0][1]) - (x[0][0] * x[1][1]));
        if (uwurzel > 0)
        {
            *e1 = (((x[1][1] + x[0][0]) / 2) + sqrt(uwurzel));
            *e2 = (((x[1][1] + x[0][0]) / 2) - sqrt(uwurzel));
            return 1;
        }
        else
        {
            return 0;
        }
    }
    
    int main()
    {
        double E1, E2;
        srand(time(NULL));
    
        x[0][0] = rand() % 100;
        x[0][1] = rand() % 100;
        x[1][0] = rand() % 100;
        x[1][1] = rand() % 100;
    
        if (eigen(&E1, &E2))
        	printf("Eigenwert1= %.1f\nEigenwert2= %.1f\n", E1, E2); 
        else
            printf("Fehlermeldung\n");
    
        return 0;
    }
    


  • Da ist ja immer noch die unsinnige globale Variable vorhanden.



  • So lautet ja auch die Aufgabe. 😞

    Aber bei den Problemen die der TE damit hatte, sicher das kleiner Übel.


Anmelden zum Antworten