您无法使用非常量整数对其维度声明静态数组。
您正在声明一个指针数组,但指针并不指向任何有效的内存,这就是为什么您会收到内存错误。
尝试此代替:
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