2016-06-07 99 views
-2

我試圖迭代地在一個指針指針中存儲一個2-d數組。我用隨機高斯值填充它,但這不是重要的部分。我嘗試填充由A指向的數組,但得到「錯誤的訪問代碼」錯誤。我將如何正確填充數組/指針?謝謝。在for循環C++中分配指針指針

INT主(){

int N = 100; 
double **A[N][N]; 
for(int i = 0; i< N; i++){ 
    for(int j =0; j < N; j++){ 
     random_device rd; 
     default_random_engine generator; 
     generator.seed(rd()); 
     normal_distribution<double> distribution(0.0,1.0); 
     **A[i][j] = distribution(generator); // error here, bad access code 1 
    } 
} 
+2

需要注意的是你的第二個行聲明**指針的二維數組**的**雙指針**。你只能改變'A [i] [j]'的值。如果你想爲'** A [i] [j]'賦值,你必須首先使用'new'爲它分配內存。 – Xiobiq

+0

警告:您不想在每次使用隨機數生成器時重新生成種子。非常昂貴,可能會導致始終獲得相同的數字,具體取決於'std :: random_device'的實現。在程序的開始附近對發生器進行種子處理。 – user4581301

回答

2

首先,改變double **A[N][N];double **A;。你想要一個雙指針,而不是雙指針矩陣。然後,你必須分配這樣的內存:A=new double*[N];然後for(i=0;i<N;i++) A[i]=new double[n];然後一切都會正常工作。您將以正常方式訪問矩陣元素,A[i][j],而不是**A[i][j]! 此示例代碼將使您熟悉的概念:

#include <iostream> 

int main() { 

    int n=100; 

    double **a; 
    a=new double*[n]; 
    for(int i=0;i<n;i++) a[i]=new double[n]; 

    a[1][2]=3; 

    std::cout<<a[1][2]; 

    for(int i=0;i<n;i++) delete a[i]; 
    delete[] a; 

    return 0; 
} 
+1

你的代碼不會'刪除'分配的內存 – Xiobiq

+0

謝謝,這似乎工作。現在的問題是我試圖使用svdcomp.C程序,你必須傳遞一個雙指針。當我通過** A時,它給了我錯誤'沒有匹配的調用函數。'有什麼想法或建議嗎? – PatEugene

+1

@PatEugene你可能想問一個單獨的問題 – Xiobiq

1

的錯誤是在這裏:double**

**A[i][j] = distribution(generator); 

A[i][j]存儲值。因此,您需要先將您的隨機值存儲在有效地址中,然後將其存儲在A中。

/*Assign a new double* pointer to A[i][j]*/ 
A[i][j] = new double*; 

/*Assign a new double pointer which is addressed by A[i][j]*/ 
*A[i][j] = new double; 

/*Assign value to **A[i][j] */ 
**A[i][j] = distribution(generator); 
+0

'A [i] [j] =分配(發生器)'將分配一個指向雙指針的指針('double **')'double' – Xiobiq

+0

@Polikdir我不知道函數'distribution( )'返回,並認爲它是'double **'類型。如果你能說出來會很棒。 –

+0

你應該在做這些事情之前檢查過[documentation](http://en.cppreference.com/w/cpp/numeric/random/normal_distribution/operator())。這也很直觀。 – Xiobiq

2

您無法使用非常量整數對其維度聲明靜態數組。

您正在聲明一個指針數組,但指針並不指向任何有效的內存,這就是爲什麼您會收到內存錯誤。

嘗試此代替:

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); 
    } 
} 
+0

@ M.M:我改變了我的答案。 –