對於這個C代碼,可能有上百種舊式或低效的東西。但主要是,我只想知道爲什麼我在例程「jacobi_solve」中遇到seg錯誤。該驅動程序代碼是在這裏:將數組傳遞給一個函數 - 出了什麼問題?
#include <stdio.h>
#include <stdlib.h>
int main() {
int m=20, n=20;
int i,j;
double A[m][n],Anew[m][n];
for (j=0;j<n;j++){
for (i=0;i<m;i++){
A[j][i] = 0.; Anew[j][i] = 0.;
}
}
A[10][10] = 1.;
printf("%x\n",A);
jacobi_solver(A,Anew,m,n);
}
和jacobi_solver是在這裏:
#include<stdio.h>
#include<math.h>
void jacobi_solver(double **A, double **Anew, int m, int n) {
double err,tol=1.e-6;
int iter=0,iter_max=100;
int i,j;
err = tol*10.;
printf("hello\n");
printf("%f %f %d %d\n",err,tol,iter,iter_max);
printf("%x\n",A);
printf("%f\n",A[10][10]); /* <--- seg fault! */
printf("solving ...\n");
while (err > tol && iter < iter_max) {
for(j = 1; j < n-1; j++) {
for(i = 1; i < m-1; i++) {
Anew[j][i] = 0.25 * (A[j][i+1] + A[j][i-1] +
A[j-1][i] + A[j+1][i]);
err = fmax(err, abs(Anew[j][i] - A[j][i]));
}
}
printf("%f\n", err);
for(j = 1; j < n-1; j++) {
for(i = 1; i < m-1; i++) {
A[j][i] = Anew[j][i];
}
}
iter++;
}
}
需要注意的是,如果我拿走打印語句,我得到一個賽格故障後,在主迴路解決。
'**'是指向指針的指針,而不是指向2D數組的指針。 – Unimportant
這是我總是感到困惑的地方。我認爲數組和指針幾乎是一回事,然後我被告知它們不是。從來沒有真正找出差異。任何好的參考? –
一些很好的答案在這裏:http://stackoverflow.com/questions/1335786/c-differences-between-char-pointer-and-array – Unimportant