noch ein problem



  • Hi,
    meine Aufgabe lautet:
    Schreibt eine Funktion mypot(), die einen Zeiger auf eine float-Variable x und eine unsigned int-Variable n als Parameter besitzt, ein float-Array A der Länge n + 1 mittels malloc erzeugt und es mit den Potenzen xi, i = 0; : : : ; n, füllt. Rückgabewert der Funktion soll der Zeiger auf das erste Element von A sein und der Inhalt der Variablen x soll nach dem Funktionsaufruf xn betragen. Schreibt weiterhin ein Rahmenprogramm, das die Funktion mypot() für x = 3 und n = 2 aufruft und anschließend sowohl x als auch das Array A ausgibt.
    ich hab was vorgeschrieben, aber das ist nicht mal die hälfte von der aufgabe 😞

    #include <stdio.h>
    #include <stdlib.h>
    
    float mypot(float *x,unsigned int *n){
    float sicher=x;
    float A[]=(float*)malloc(n+1);
      for(int i=0;i<=n;i++)
      A[]=pow(sicher,i);
      x=pow(x,n);
    
    return (&A[0]);
    }
    
    int main(){
    int x=3,n=2;
    mypot(&x,&n);
    printf("ARRAY A: %d x: %d", A[],x);
    
    return 0;
    }
    


  • Fürs erste:

    mypot soll doch einen Zeiger zurückgeben. n ist kein Zeiger. Also

    float* mypot(float *x,unsigned int n){
    

    A[] ist in main unbekannt. (Fehler/Warnung vom Compiler beachten).

    float *B;
    B = mypot(&x,n);
    

    Arrays können nicht auf einmal ausgegeben werden. Darum eine Schleife drum. Wie das geht weißt du.

    Und am Ende free(B) nicht vergessen



  • #include <stdio.h>
    #include <stdlib.h>
    
    float *mypot(float *x,unsigned int n){
    size_t i;
    float f=n,*A=malloc(++n*sizeof*x); /* <-- jetzt korrekte Speichergröße */
      for(i=0;i<n;i++)
        A[i]=pow(*x,f=i);
    return A;
    }
    
    int main(){
    unsigned n=2;
    float x=3.,*A=mypot(&x,n++);
    printf("x: %f", x);
    while( n-- ) printf("\n%f",A[n]);
    free(A);
    return 0;
    }
    


  • Es muss heißen

    A[i]=pow(*x,(double)i);
    

    und #include <math.h> wegen pow

    oder ohne pow

    float *mypot(float *x,unsigned int n){
      size_t i;
      *A=malloc(n+1);  
      A[0] = 1; // per Definition
      for(i=1;i<=n;i++)
        A[i]=A[i-1] * *x;
      return A;
    }
    


  • Naja ich bekomme ja bei sowas eine Heap Corruption...

    #include <stdio.h> 
    #include <stdlib.h> 
    #include <math.h>
    
    float* mypot(float *x, const unsigned int& n)
    { 
    	float* B = (float*)malloc(n+1); 
    
    	for(unsigned int i = 0; i <= n; i++)
    		B[i]=pow(*x,(int)i); 
    
    	*x = pow(*x, (int)n); 
    
    	return B; 
    } 
    
    int main()
    { 
    	const unsigned int n=2;
    	float x=3., *A = mypot(&x, n);
    
    	for(unsigned int i = 0; i < n + 1; i++)
    		printf("Array: %f\n",A[i]);
    
    	printf("x: %f",x);
    
    	//free(A); //Heap corruption
    
    	getchar();
    	return 0; 
    }
    


  • ich versteh das nicht...

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    float *mypot(float *x, const unsigned int &n)
    {
        float *B = (float*)malloc(n+1);
        unsigned int i;
        for(i = 0; i <= n; i++)
            B[i]=pow(*x,(int)i);
    
        *x = pow(*x, (int)n);
    
        return B;
    }
    
    int main()
    {
        const unsigned int n=2;
        float x=3., *A = mypot(&x, n);
        unsigned int i;
        for(i = 0; i < n + 1; i++)
            printf("Array: %f\n",A[i]);
    
        printf("x: %f",x);
    
        //free(A); //Heap corruption
    
        getchar();
        return 0;
    }
    

    zeigt bei mir fehler..
    und

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    float *mypot(float *x,unsigned int n){
    size_t i;
    float f=n,*A=malloc((n+1)*sizeof*x); /* <-- jetzt korrekte Speichergröße */
      for(i=0;i<=n;i++)
        A[i]=pow(*x,f);
    return A;
    }
    
    int main(){
    unsigned n=2;
    float x=3.,*A=mypot(&x,n);
    printf("x: %f", x);
    ++n;
    while( n-- ) printf("\n%f",A[n]);
    free(A);
    return 0;
    }
    

    läuft zwar, aber um ehrlich zu sein hab ich das nicht wirklich verstanden.. 😞
    welches ist jezt richtig?

    danke für eure hilfe



  • Richtig ist keins von beiden.
    Beim ersten ist der malloc falsch (fehlendes sizeof)
    Beim zweiten ist die Berechnung falsch. Das liefert n+1 mal die gleiche Zahl.
    Richtig:

    A[i]=pow(*x,(double)i); // pow erwartet zwei double
    


  • geirrt.



  • Dir ist schon klar, dass in C keine Funktionsüberladungen existieren?

    Wir kennen langsam dein ödes cplusplus.com, aber selbst da:

    Die unnötige Referenz schrieb:

    In C, only the version taking two double parameters exists with this name. The other overloads are only available in C++.



  • aber da kommt segmentation fault beim ausführen 😞
    wieso klappt das nicht
    😞



  • problemkinder schrieb:

    aber da kommt segmentation fault beim ausführen 😞
    wieso klappt das nicht
    😞

    segmentation fault deutet auf falschen Speicherzugriff hin.

    Gibt das Programm den irgendetwas aus?
    Ansonsten mach mal ein paar printf rein:

    const unsigned int n=2;
        float x=3., *A = mypot(&x, n);
        unsigned int i;
    
    const unsigned int n=2;
        float x=3., *A;
        unsigned int i;
    
        printf("Rufe mypot auf: %p\n", A);
        A = mypot(&x, n)
        printf("Rufe mypot fertig: %p\n", A);
    

    entsprechend in mypot.



  • DirkB schrieb:

    problemkinder schrieb:

    aber da kommt segmentation fault beim ausführen 😞
    wieso klappt das nicht
    😞

    segmentation fault deutet auf falschen Speicherzugriff hin.

    Gibt das Programm den irgendetwas aus?
    Ansonsten mach mal ein paar printf rein:

    const unsigned int n=2;
        float x=3., *A = mypot(&x, n);
        unsigned int i;
    
    const unsigned int n=2;
        float x=3., *A;
        unsigned int i;
    
        printf("Rufe mypot auf: %p\n", A);
        A = mypot(&x, n)
        printf("Rufe mypot fertig: %p\n", A);
    

    entsprechend in mypot.

    klappt nicht... also da steht ja eig. printf("x: %f",x); sollte der ja ausgeben aber macht er nicht

    wofür ist eigentlich free(A)???
    und wieso läuft das programm nicht
    bin voll verzweifelt



  • klappt nicht... also da steht ja eig. printf("x: %f",x); sollte der ja ausgeben aber macht er nicht

    Poste doch mal den aktuellen Code.

    wofür ist eigentlich free(A)???

    Du forderst mit malloc Speicher vom Heap, den must auch wieder freigeben.

    und wieso läuft das programm nicht
    bin voll verzweifelt

    Ich/wir kennen das aktuelle Programm ja gar nicht.


Log in to reply