2013-04-06 35 views
2

該程序必須具有一個函數,該函數可以接受2個數組並將其產品返回到第三個數組中。所有的數組都必須是2d,並且一個單獨的函數必須完成成員元素的乘法運算。當我在Visual Studio中運行此我得到的錯誤:修改函數中第2個參考數組的值

Unhandled exception at 0x003f15ec in program4.exe: 0xC0000005: 
Access violation reading location 0x00000000. 

這可能是因我缺乏對C++的知識,但我想我可能犯語法錯誤或東西。 下面是程序:

#include<iostream> 
using namespace std; 

void ProductArrays(int[3][4], int[3][4], int** array3[3][4]); 


void main() 
{ 
int array1[3][4] = { {1,3,5,7}, {9,11,13,15}, {17,19,21,23} }; 
int array2[3][4] = { {2,4,6,8}, {10,12,14,16}, {18,20,22,24} }; 
int** array3[3][4] = {0,0,0,0,0,0,0,0,0,0,0,0}; 

ProductArrays(array1, array2, array3); 

system("pause"); 
return; 
} 

void ProductArrays(int array1[3][4], int array2[3][4], int** array3[3][4]) 
{ 
int i,j; 
for (i=0;i<3;i++) 
    { 
    for(j=0;j<4;j++) 
     { 
      **array3[i][j] = array1[i][j] * array2[i][j]; 
     } 
    } 
return; 
} 
+1

'void main()'是非標準的。使用'int main()'和'return 0;'或者將其全部保留。一個好的編譯器不應該接受'void main()'。 – chris 2013-04-06 20:16:46

回答

1

(1)
爲ARRAY3聲明是錯誤的,因爲你需要。

int** array3[3][4] = {0,0,0,0,0,0,0,0,0,0,0,0}; 

你需要這個,如果我理解正確的問題:

int array3[3][4] = {0,0,0,0,0,0,0,0,0,0,0,0}; 

(3)
你得到錯誤,因爲你是在創造這些都指向NULL指針二維數組(0 ),並且您正在分配到0位置。

**array3[i][j] = array1[i][j] * array2[i][j]; 
      ^assign to `0` location 

(2)
聲明你的功能,如:

void ProductArrays(int array1[3][4], int array2[3][4], int (*array3)[4]) 
{ //              ^notice 
int i,j; 
for (i=0;i<3;i++) 
    { 
    for(j=0;j<4;j++) 
     { 
      array3[i][j] = array1[i][j] * array2[i][j]; 
     //^remove ** 
     } 
    } 
return; 
} 

調用它從主像:

ProductArrays(array1, array2, array3); 

另外一點,我的回答是路過的地址, @巴里的答案是通過參考。在C++中都允許。 (在C只能通過地址是可能的

通過引用通過指針的權力,但很容易使用像值變量所以,@巴里的答案是更好的。考慮我的理解觀點。

+1

請注意,int(* array3)[4]','int array3 [3] [4]'等價於函數參數。 – 2013-04-06 20:45:48

+0

@JesseGood是'int array3 [3] [4])'和'int(* array3)[4]'在函數參數中是一樣的。參數參數混淆了我:) ..謝謝。 – 2013-04-06 20:52:07

+0

謝謝,您的回答幫助我更好地瞭解地址和參考。 – Rdd 2013-04-08 17:36:36

2

我認爲你的意思是array3是指向2d指針數組的引用,但它實際上是int**的2d數組。所以,當你做乘法,這部分:

**array3[i][j] 

試圖取消引用什麼在array3[i][j],這是0,因此AccessViolation。我想你可能是指簽名是:

void ProductArrays(int array1[3][4], int array2[3][4], int (&array3)[3][4]) 

並聲明array3是與array1和array2相同的類型。

+0

'int(&)[3] [4]',聲明'array3'爲'int array3 [3] [4]',並通過'array3'傳遞。 – chris 2013-04-06 20:19:51

+0

'int&array3 [3] [4]'是一個引用數組(不允許)。我想你的意思是int(&array3)[3] [4]'。 – 2013-04-06 20:24:31