Dynamiczna alokacja tablicy - naruszenie ochrony pamięci

0

Witam. Piszę w C++ program, który ma za zadanie policzyć pochodną pierwszą i drugą w danym punkcie korzystając z numerycznej metody operatora różnic wstecznych

 
#include<iostream>
#include<cmath>

using namespace std;

double funkcja(double x)
{
       return log(x);
}

int main()
{
    double x0,h=0.1;
    int n;//ilosc przedzialow


    //tablica roznic wstecznych
   double **nabel=new double *[n];

   for(int i=0;i<n;i++)
    {
            nabel[i]=new double[n];

    }
    char znak;
   double *p1=new double [n];
 //  double *p2=new double[n];

    cout<<"Podaj wartosc x0 dla ktorego zostanie policzona wartosc pochodnej funkcji"<<endl;
    cin>>x0;
    cout<<"Podaj ilosc przedzialow n: "<<endl;
    cin>>n;

   for(int i=0;i<n;i++)               //i:wiersze, j:kolumny
   {
        nabel[i][0]=funkcja(x0 - i*h);
        cout<<nabel[i][0]<<endl<<endl;

   }
    int temp=n;

    for(int j=1;j<=n-1;j++)
    {
        for(int i=0;i<(temp-1);i++)
            {
                nabel[i][j]=nabel[i][j-1]-nabel[i+1][j-1];

             }
        --temp;
    }

    for(int i=0;i<=n-1;i++)
    {
        for(int j=0;j<=n-1;j++)
        {
        cout<<nabel[i][j]<<"\t";
        }
    cout<<endl;
    }
    cout<<endl<<endl;

        for(int j=1;j<=n-1;j++)
        {
            p1[j]=p1[j-1]+nabel[0][j]/j;

        }
        p1[4]/=h;
        cout<<"Wartosc pochodnej funkcji w punkcie "<<x0<<" wynosi: "<<p1[4]<<endl;
    
for(int i=0;i<n;i++)
    {
    delete [] nabel[i];

    }
    delete [] nabel;
    delete [] p1;
 //   delete []p2;




//    system("PAUSE");
 return 0;
}

Jeśli zakomentuję deklarację dynamicznej tablicy p2 (tak jak w wklejonym kodzie) wszystko kompiluje się poprawnie i nie ma problemu,program działa jak należy. Gdy chcę obliczyć drugą pochodną, deklaruję tablicę p2 i podczas kompilacji terminal wypluwa mi "Naruszenie ochrony pamięci(core dumped)". Czytałem już na wielu stronach o tym problemie, ale nie rozumiem co jest nie tak, wydaję mi się że nie przekraczam dozwolonej pamięci. Próbowałem ustawiać różne rozmiary tablicy, np.

double *p2=new double[3] 

i błąd mimo wszystko się pojawia. Dodam,że pracuję na Linuxie. Kompilując ten kod na Windowsie kompilator kończy działanie. Ktoś wie jak sobie z tym poradzić?

0

Tworzysz tablicę w momencie kiedy wartość n nie jest jeszcze znana. Pobierasz ją od użytkownika dopiero kilka linijek później. Zamień kolejność i będzie OK.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.