Funktionsparameter

sfuccma

Grünschnabel
ja Hallo ertsmal.......

ich suche dringend rat......
wir haben da so eine aufgabe bekommen, wir sollen anhand des newtonschen verfahren nullstellen eines graphen ermitteln......ich hab das programm fast fertig hab nur noch 3 warnings......da es sich bei diesen warnings leider um zeigerangelegenheiten handelt bin ich aufgeschmissen ich hoffe dass mir einer hlefen kann.....

code folgt

PHP:
#include<stdio.h>
#include<math.h>

#define F_1 "f(x)=cos(x)-x"/*erste funk.*/
#define F_2 "f(x)=(x^3)-x"/*zweite funk.*/
#define F_3 "f(x)=|x|"/*dritte funk*/

#define h 0.001/*naeherngskonstante*/
#define g 8/*stellen nach dem komma*/

double funktion_1 ( double x )
{
   return cos(x)-x;
}

double funktion_2 ( double x )
{
   return pow(x,3)-x;
}

double funktion_3 ( double x )
{
   return fabs(x);
}

double diff ( double (*f)(double), double x )/*finktion zur ermittlung*/
{/*des wertes der ableitung an der stelle x*/
   double ergebnis;
   ergebnis = ((*f)(x+h)-(*f)(x-h))/(2*h);
   return ergebnis;
}

int newton ( double (*f)(double), double (*diff)(double,double), double x )
{/*newtonsche verfahren zur naeherung an die nullstelle*/
   int i=1;
   double genauigkeit = pow(10,-1*g);
   double wert;

   do
   {
      wert = f(x);

      if ( diff(f(x),x) == 0 )
         return -1;

      x = x - ((f(x))/diff(f(x),x));
      printf("\n%d. Iterartion = %.8lf",i,x);
      i++;
   } while ( fabs(wert-(f(x))) > genauigkeit );

   return i;
}/*rueckgabe anzahl der iterationen*/

int main()
{
   double x,startwert;
   int check, wahl,error,iteration;

   printf("\nWelche Funktion soll nach Nullstellen ntersucht werden?");
   printf("\n ( 1 ) %s",F_1);
   printf("\n ( 2 ) %s",F_2);
   printf("\n ( 3 ) %s",F_3);
   printf("\nBitte waehlen Sie :");

   do
   {
      error=0;
      check=scanf("%d",&wahl);
      if(check!=1 || wahl > 3 || wahl < 1)
      {
         printf("\nFalsche Eingabe Bitte neu :");
         error=1;
      }
   } while (getchar()!='\n' || error==1);

   printf("\n\nBitte geben Sie den Startwert ein >>> ");

   do
   {
      error=0;
      check=scanf("%lf",&startwert);
      if(check!=1)
      {
         printf("\nFalsche Eingabe Bitte neu >>> ");
         error=1;
      }
   } while(getchar()!='\n' || error==1);

   switch(wahl)
   {
      case 1:
         printf("\n\n%s wird jetzt untersucht",F_1);
         iteration = newton(funktion_1,diff,startwert);
         if(iteration<0)
            return -1;
         printf("\n%d Iterationen durchgefuehrt,",iteration-1);
         printf("\nNullestelle liegt bei x = %.8lf",startwert);
         break;
      case 2:
         printf("\n\n%s wird jetzt untersucht",F_2);
         iteration = newton(funktion_2,diff,startwert);
         if(iteration<0)
            return -1;
         printf("\n%d Iterationen durchgefuehrt,",iteration-1);
         printf("\nNullestelle liegt bei x = %.8lf",startwert);
         break;
      case 3:
         printf("\n\n%s wird jetzt untersucht",F_3);
         iteration = newton(funktion_3,diff,startwert);
         if(iteration<0)
            return -1;
         printf("\n%d Iterationen durchgefuehrt,",iteration-1);
         printf("\nNullestelle liegt bei x = %.8lf",startwert);
         break;
   }
   return 0;
}

das ist dann mal der code ich hofffe nicht zu unübersichtlich;-)

nun zu den warnings.......

HTML:
C:\Users\admin\Documents\prog\prak06\newton.c||In function `main':|
C:\Users\admin\Documents\prog\prak06\newton.c|94|warning: passing arg 2 of `newton' from incompatible pointer type|
C:\Users\admin\Documents\prog\prak06\newton.c|102|warning: passing arg 2 of `newton' from incompatible pointer type|
C:\Users\admin\Documents\prog\prak06\newton.c|110|warning: passing arg 2 of `newton' from incompatible pointer type|
||=== Build finished: 0 errors, 3 warnings ===|

Danke schonmal im vorraus und gute nacht noch.....

mfg sfuccma
 
Hi, willkommen bei tutorials.de!
C:
double diff ( double (*f)(double), double x )/*finktion zur ermittlung*/

int newton ( double (*f)(double), double (*diff)(double,double), double x )

iteration = newton(funktion_1,diff,startwert);
Du übergibst die Funktion diff als zweiten Parameter an die Funktion newton. Die Signatur der Funktion passt nicht zur Signatur des Parameters.

Du müßtest die Funktion newton so deklarieren:
C:
int newton (double (*f)(double), double (*diff)(double (*)(double), double), double x)
und dann der diff Funktion auch die Funktion übergeben und nicht nur den Funktionswert.

Gruß

PS: Bitte beachte die Netiquette und verwende die übliche Groß-/Kleinschreibung!
 
Ui mal jemand der sich nochmal an Funktionszeiger ranwagt :)

Naja deinen Fehler hättest du leichter gefunden, wenn du einfach mal typedef's für deine Funktionszeiger nimmst ;)
 
Zurück