2

このプログラムには、2 つの配列を受け入れ、その積を 3 番目の配列で返すことができる関数が必要です。すべての配列は 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;
}
4

2 に答える 2

2

ポインターの2次元配列への参照であるという意味だと思いますarray3が、実際には.の2次元配列です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 および array2 と同じ型になるように宣言します。

于 2013-04-06T20:18:41.850 に答える
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 ( ) を指しているポインターの 2D 配列を作成していて、場所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);

追加のポイント、私の答えはアドレス渡しであり、@Barryの答えは参照渡しです。C++ では両方が許可されます。( Cではアドレス渡しのみ可)

参照渡しにはポインターの力がありますが、値変数のように簡単に使用できるため、@ Barryの答えの方が優れています。視点を理解するための私の答えを検討してください。

于 2013-04-06T20:18:01.093 に答える