Core dumped - dynamiczna alokacja pamięci

Odpowiedz Nowy wątek
2015-04-25 17:21
0

Hej!

Piszę program do swojej pracy licencjackiej i mam problem z dynamiczną alokacją pamięci dla dwóch tablic dwuwymiarowych. Najpierw w ramach testu zaalokowałam je statycznie, ale wtedy już dla L=30 wyskakiwał core dump - dla mniejszych wszystko było w porządku. Teraz naruszenie ochrony pamięci wyskakuje za każdym razem i nie mam pojęcia dlaczego, tak naprawdę dopiero uczę się dynamicznie alokować pamięć. Wklejam cały kod, razem z moimi chaotycznymi i może niezbyt jasnymi dla szerszego grona obliczeniami, bo może ktoś znajdzie powód wyskakiwania błędu w miejscu, w którym się go nie spodziewam. :)


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

int main(int argc, char *argv[]){

    int L=atoi(argv[1]);

    double **source_x = (double**)malloc(L * sizeof(double*));
    int i;

    for (i=0; i<L; i++){
        source_x[i] = (double*)malloc(L * sizeof(double));
    }

    double **source_y = (double**)malloc(L * sizeof(double*));

    for (i=0; i<L; i++){
        source_y[i] = (double*)malloc(L * sizeof(double));
    }

    double b, q; 
    double A[2][2]; // macierz deformacji
    double dx_dy, dx_dx, dy_dy, dy_dx;
    double det, tr;

    b=1;
    q=0.7;

    int j;
    double x, y;
    double alfa_x, alfa_y; 
    double k1, k2;

    for (i=0; i<L*L; i++){

            x=1.*i;

        for (j=0; j<L*L; j++){

            y=1.*j;

            alfa_x=((b*pow(q, 2)*x)/(sqrt(pow(q, 2)*pow(x, 2)+pow(y, 2))));
            alfa_y=((b*y)/(sqrt(pow(q, 2)*pow(x, 2)+pow(y, 2))));

            source_x[i][j]=x-alfa_x;
            source_y[i][j]=y-alfa_y;

        }
    }
    for (i=1; i<L*L-1; i++){

        x=1.*i;

        for (j=1; j<L*L-1; j++){

            y=1.*j;

            dx_dy=(source_x[i][j+1]-source_x[i][j-1])/(2.);
            dx_dx=(source_x[i+1][j]-source_x[i-1][j])/(2.);
            dy_dy=(source_y[i][j+1]-source_y[i][j-1])/(2.);
            dy_dx=(source_y[i+1][j]-source_y[i-1][j])/(2.);

            A[0][0]=dx_dx;
            A[0][1]=dx_dy;
            A[1][0]=dy_dx;
            A[1][1]=dy_dy;

            det=A[0][0]*A[1][1]-A[0][1]*A[1][0];
            tr=A[0][0]+A[1][1];

            if(det>0 && tr<0)
                printf("%d  %d\n", i, j);
            k1=(1-det)/2.;
            k2=(b*pow(q, 2)*(pow(x, 2)+pow(y, 2))/(2*pow(pow(q, 2)*pow(x, 2)+pow(y, 2), 1.5)));
            printf("k1=%lf, k2=%lf\n", k1, k2);
        }
     }

    for (i=0; i<L; i++){
        free(source_x[i]);
    }
    free(source_x);

    for (i=0; i<L; i++){
        free(source_y[i]);
    }
    free(source_y);

    return 0;
}

Byłabym bardzo wdzięczna, gdyby ktoś mi pomógł. :)

Pozostało 580 znaków

2015-04-25 17:31
0

A czego ty się niby spodziewasz? Robisz sobie tablice o rozmiarze LxL a następnie masz pętle:
for (i=0; i<L*L; i++){ oraz for (j=0; j<L*L; j++){
czyli zarówno i jak i j będą z przedziału 0..L2 a powinny być z 0..L


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2015-04-25 17:40
0

Pisząc tutaj na pewno spodziewam się tego, że ktoś spostrzeże błąd, którego mi spostrzec się nie udało, ale niekoniecznie tego, że będzie na mnie naskakiwał.
Niemniej dziękuję za wyłapanie tego, pomogło.

Na przyszłość polecam używanie debuggera... - Shalom 2015-04-25 17:52

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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