您無法使用非常量整數對其維度聲明靜態數組。
您正在聲明一個指針數組,但指針並不指向任何有效的內存,這就是爲什麼您會收到內存錯誤。
嘗試此代替:
const int N = 100;
double A[N][N];
random_device rd;
default_random_engine generator;
generator.seed(rd());
normal_distribution<double> distribution(0.0,1.0);
for(int i = 0; i < N; ++i) {
for(int j = 0; j < N; ++j) {
A[i][j] = distribution(generator);
}
}
可替換地,在堆上分配,而不是堆棧陣列(然後可以使用尺寸的非const int的):
int N = 100;
double **A = new double*[N];
for(int i = 0; i < N; ++i) {
A[i] = new double[N];
}
random_device rd;
default_random_engine generator;
generator.seed(rd());
normal_distribution<double> distribution(0.0,1.0);
for(int i = 0; i < N; ++i) {
for(int j = 0; j < N; ++j) {
A[i][j] = distribution(generator);
}
}
...
for(int i = 0; i < N; ++i) {
delete[] A[i];
}
delete[] A;
或者這:
int N = 100;
double *A = new double[N*N];
random_device rd;
default_random_engine generator;
generator.seed(rd());
normal_distribution<double> distribution(0.0,1.0);
for(int i = 0; i < N; ++i) {
for(int j = 0; j < N; ++j) {
A[(i*N)+j] = distribution(generator);
}
}
...
delete[] A;
這樣說,最好用std::vector
代替new[]
手動:
int N = 100;
std::vector<std::vector<double> > A(N);
for(int i = 0; i< N; i++) {
A[i].resize(N);
}
random_device rd;
default_random_engine generator;
generator.seed(rd());
normal_distribution<double> distribution(0.0,1.0);
for(int i = 0; i < N; ++i) {
for(int j = 0; j < N; ++j) {
A[i][j] = distribution(generator);
}
}
或者:
int N = 100;
std::vector<double> A(N*N);
random_device rd;
default_random_engine generator;
generator.seed(rd());
normal_distribution<double> distribution(0.0,1.0);
for(int i = 0; i < N; ++i) {
for(int j = 0; j < N; ++j) {
A[(i*N)+j] = distribution(generator);
}
}
需要注意的是你的第二個行聲明**指針的二維數組**的**雙指針**。你只能改變'A [i] [j]'的值。如果你想爲'** A [i] [j]'賦值,你必須首先使用'new'爲它分配內存。 – Xiobiq
警告:您不想在每次使用隨機數生成器時重新生成種子。非常昂貴,可能會導致始終獲得相同的數字,具體取決於'std :: random_device'的實現。在程序的開始附近對發生器進行種子處理。 – user4581301