[C] stack overflow

0

witam mam taki program do obbliczania aproksymacji sredniokwadratowej punktowej wielomianowej, czy pomocy wielomianow grama (niech nikogo to nie przeraza, pytanie jest o przepelnienie stosu)

#include <stdio.h>
#include <string.h>
#include <math.h>



double gram(double q, int k, int n);
double newton(int k, int s);
int silnia(int arg);
double wiel_czyn(double q, double s);
double wwu(int j, int n, double *x); //wspolczynnik wielomianu uogolnionego
double wiel_aprox(int m, int n, double x); //wielomian aproksymujacy m-tego stopnia
void wczytaj(void); //funkcja czytajaca dane.

double f[5]; //wartosci funkcji w punktach aproxymacji
double x[5]; //dane punkty aproxymacji
double a[5]; //a0...an;


double gram (double q, int k, int n)
{
	int s;
	double pom;

	for(s = 0; s<= k; s++)
	{
        	pom += pow(-1,s)*newton(k,s)*newton((k+s), s)*(wiel_czyn(q,s)/wiel_czyn(n,s));
	}

        return pom;
}

double newton(int s, int k)
{
	return (silnia(k))/(silnia(s)*silnia(k-s));
}


int silnia(int arg)
{
	if(arg == 0)
         return 1;
	else
         return silnia(arg-1)*arg;
}

double wiel_czyn(double q, double s)
{
	double pom = 1;
        int i;
	if(s == 0)
	 return 1;
	else
	 for(i=0;i<=s; i++)
	 {
		if(i == s)
                {
                 pom *= (q - s + 1);
                 break;
                }
		pom *= (q-i);
	 }

         return pom;
         
}

double wwu(int j, int n, double *x)
{
	double glowna, pom1, pom2;
	int i;

	for(i=0; i<= n; i++)
	{
		pom1 += f[i]*gram(x[i],j,n);
	}

	for(i=0; i<= n; i++)
	{
		pom2 += gram(x[i],j,n)*gram(x[i],j,n);
	}

	glowna = pom1 / pom2;

	return glowna;
	
}

double wiel_aprox(int m, int n, double x)
{
	int j;
	double pom;

	for(j=0; j<=m; j++)
	{
		pom += wwu(j, n, &x)*gram(x, j, n);
	}

	return pom;
}

void wczytaj(void)
{
	int i;
	for(i=0; i<=5; i++)
	{
		printf("Podaj wspolczynnik x[%d]: ",i+1);
		scanf("%d",&x[i]);
		printf("Podaj wartosc funkcji f w tym punkcie f[%d]: ",i+1);
		scanf("%d", &f[i]);
	}
}

int main ()
{
	int counter;

	wczytaj();
	for(counter =1; counter <=6; counter++)
	{
		a[counter] = wwu(counter,5,x);
	}
	return 1;

	for(int i=0; i<=5; i++)
	{
		printf("a[%d] = %2.2lf",i, a[i]);
	}
}

Czemu, wychodzi mi, że argument funkcji silnia jest -93456544, jak tam zawsze sa liczby 1,2,3... itd...?? proszę o pomoc, to ważny program na zaliczenie...

Pozdrawiam.

0

Jak wywolujesz silnia(-1) to nic dziwnego. Uzyj debuggera bo nikt za Ciebie nie bedzie tego analizowal.

0

Dlaczego przepełnienie stosu? Czy chciałeś wynik 4201510752, jeżeli tak, to podawaj wynik w typie unsigned.

1 użytkowników online, w tym zalogowanych: 0, gości: 1