将数组传递给函数——出了什么问题?
passing an array to a function -- what is going wrong?
此 C 代码可能有一百个过时或低效的地方。但主要是,我只想知道为什么我在例程 "jacobi_solve" 中遇到段错误。驱动代码在这里:
#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++;
}
}
请注意,如果我去掉 print 语句,稍后会在主求解循环中出现段错误。
代码不正确 - 您不能像在 C 中使用二维数组那样使用 double**(与 double* 和一维数组不同,这有点令人困惑,但如果您了解内存的工作原理则不会).我建议您按照
中建议的方式之一实现您自己的二维数组包装器
How do I work with dynamic multi-dimensional arrays in C?
将求解器函数的界面更改为
void jacobi_solver(int m, int n, double A[n][m], double Anew[n][m]) {
...
}
二维数组应该就这样使用。特别是 is 不是 table 指向向量的指针,正如您所拥有的那样。数组大小必须放在第一位,以便您可以将它们用于数组参数。
这应该适用于至少符合 C99 的所有编译器。
此 C 代码可能有一百个过时或低效的地方。但主要是,我只想知道为什么我在例程 "jacobi_solve" 中遇到段错误。驱动代码在这里:
#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++;
}
}
请注意,如果我去掉 print 语句,稍后会在主求解循环中出现段错误。
代码不正确 - 您不能像在 C 中使用二维数组那样使用 double**(与 double* 和一维数组不同,这有点令人困惑,但如果您了解内存的工作原理则不会).我建议您按照
中建议的方式之一实现您自己的二维数组包装器How do I work with dynamic multi-dimensional arrays in C?
将求解器函数的界面更改为
void jacobi_solver(int m, int n, double A[n][m], double Anew[n][m]) {
...
}
二维数组应该就这样使用。特别是 is 不是 table 指向向量的指针,正如您所拥有的那样。数组大小必须放在第一位,以便您可以将它们用于数组参数。
这应该适用于至少符合 C99 的所有编译器。