[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, botów: 0