2013-08-24 116 views
0

我試圖傳遞兩個二維數組(同一大小; 8乘四)到一個函數,並設置一個等於另一個(與一些不同的順序元素,但不真的物)。到目前爲止,我有:將二維數組傳遞給一個函數

int main() { 
    double** Array1; 
    double** Array1; 

    // MALLOC BOTH OF THEM 
    .... 

    // PUT STUFF IN ARRAY1 
    .... 

    CopyFunction(&Array1, &Array2); 
} 

void CopyFunction(double*** Array1, double*** Array2) { 
    for (int i = 0; i < 8; i++) { 
     *Array2[i][0] = *Array1[i][0]; 
     *Array2[i][1] = *Array1[i][1]; 
     *Array2[i][2] = *Array1[i][2]; 
     *Array2[i][3] = *Array1[i][3]; 
    } 
} 

但我正在逐漸段錯誤象這樣的錯誤:

*** Break *** segmentation violation 


=========================================================== 
There was a crash. 
This is the entire stack trace of all threads: 
=========================================================== 
+0

沒有理由在C++中使用'malloc'。改用'new'。也就是說,在C++中使用'new'幾乎沒有什麼理由。改用RAII。如果這些是矢量,你的代碼就像'Array2 = Array1;'一樣簡單。相關:http://klmr.me/slides/modern-cpp/#1 – chris

+0

我完全同意@chris,但我正在使用其他人制作的包需要2d陣列向量的包,所以我必須堅持這一點!謝謝 – JMzance

+0

Irrelavant:既然你沒有修改copyFunction中的指針,爲什麼不通過'double **'而不是'double ***'指針呢? – texasbruce

回答

5

你想:

(*Array2)[i][0] = (*Array1)[i][0]; 
    (*Array2)[i][1] = (*Array1)[i][1]; 
    (*Array2)[i][2] = (*Array1)[i][2]; 
    (*Array2)[i][3] = (*Array1)[i][3]; 

,因爲它是寫的,你由於操作的順序,不按照正確的順序取消引用數組。 [i][N]完成的解除引用在*之前發生。原始版本與*(*(*(Array1 + i) + N))相同(由於[]確實有效),但是您想要的內容類似於*(*(*Array1 + i) + N),這就是爲什麼您必須像我一樣添加括號。

更妙的是,雖然,會是這樣:

void CopyFunction(double** Array1, double** Array2) { 
    for (int i = 0; i < 8; i++) { 
     Array2[i][0] = Array1[i][0]; 
     Array2[i][1] = Array1[i][1]; 
     Array2[i][2] = Array1[i][2]; 
     Array2[i][3] = Array1[i][3]; 
    } 
} 

更妙的是比會是這樣:

std::copy_n(*Array1, 32, *Array2); 

編輯:雖然std::copy_n並沒有真正適合你,如果你的工作當您進行復制時,請重新更改某些元素的順序。

+0

Cheer @Cornstalks但我並沒有完全複製它們,我正在混合這個命令。很高興知道std :: copy_n雖然! – JMzance

+0

@JackMedley:嗯,好的,你的問題中的代碼是一個簡單的副本。 – Cornstalks

+0

是的,它在序言中有一個簡短的提及,但我想它並不是開關搞亂了 - 它總是指針! – JMzance

3

你應該做

(*Array2)[i][0] = (*Array1)[i][0]; 

代替

*Array2[i][0] = *Array1[i][0]; 

由於指數運算符具有較高的優先級

1
int main() { 
double** Array1; 
double** Array1; 

// MALLOC BOTH OF THEM 
.... 

// PUT STUFF IN ARRAY1 
.... 

CopyFunction(Array1, Array2); 

}

void CopyFunction(double** Array1, double** Array2) { 
    for (int i = 0; i < 8; i++) { 
    Array2[i][0] = Array1[i][0]; 
    Array2[i][1] = Array1[i][1]; 
    Array2[i][2] = Array1[i][2]; 
    Array2[i][3] = Array1[i][3]; 
} 

}

你或許應該考慮通過在數組的大小作爲參數。

相關問題