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ł. :)