2013-04-06 6 views
2

Эта программа должна иметь функцию, которая может принимать 2 массива и возвращать их продукт в третьем массиве. Все массивы должны быть 2d, а отдельная функция должна завершить умножение элементов по порядку. Когда я запускаю это в визуальной студии, я получаю ошибку:Изменение значений 2d массива ссылок в функции

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

ответ

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)
Вы получаете сообщение об ошибке, потому что вы создавали 2D массив указателей тех, которые указывают на 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]' эквивалентны как параметр функции. –

+0

@JesseGood Да 'int array3 [3] [4])' и 'int (* array3) [4]' одинаковы в аргументе функции. Параметр аргументов меня смущает :) .. Спасибо. –

+0

Спасибо, ваш ответ помог мне лучше понять по адресу и по ссылке. – Rdd

2

Я думаю, что вы имеете в виду для array3, чтобы быть ссылкой на 2d массив указателей, но это фактически 2d-массив int**. Поэтому, когда вы делаете умножение, эта часть:

**array3[i][j] 

пытается разыменования то, что в array3[i][j], что 0, следовательно AccessViolation. Я думаю, что вы, вероятно, означает, что подпись будет:

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

И объявите array3 быть того же типа, как и array1 массив2.

+0

'int (&) [3] [4]', объявить 'array3' как' int array3 [3] [4] 'и пройти через' array3'. – chris

+0

'int & array3 [3] [4]' - массив ссылок (что недопустимо). Я думаю, вы имели в виду 'int (& array3) [3] [4]'. –

Смежные вопросы