2017-06-09 9 views
-4

私はこのC++コードを書いて2つの2d行列を乗算し、結果の2d行列を返します。C++の配列とポインタの面倒なエラー

エラー[2] **

ll** multiply(ll a[2][2],ll b[2][2]) 
{ 
    ll ans[2][2]; 
    ans[0][0]=((a[0][0]*b[0][0])%mod+(a[0][1]*b[1][0])%mod)%mod; 
    ans[0][1]=((a[0][0]*b[0][1])%mod+(a[0][1]*b[1][1])%mod)%mod; 
    ans[1][0]=((a[1][0]*b[0][0])%mod+(a[1][1]*b[1][0])%mod)%mod; 
    ans[1][1]=((a[1][0]*b[0][1])%mod+(a[1][1]*b[1][1])%mod)%mod; 
    return ans; 
} 
+10

配列はポインタはちょうど 'のstd ::ポインタと生の配列をいじりの代わりにarray'を使用 –

+0

LLは長い長い –

+1

の略されていませんか? – UnholySheep

答えて

2

あなたは言語に新規参入者の多くを得るように見える罠に陥っがあるでしょうし、LL(*)を変換することはできませんです。

2D配列を関数に渡し、2D配列を関数に戻すと、エラーが発生しやすいコードになります。 strut/classを使用すると、これらのエラーが取り除かれます。あなたのケースでは

、配列のサイズが固定されているので、簡単に、そしてstruct

struct MyMatrix 
{ 
    ll data[2][2]; 
}; 

を使用する代わりに、2次元アレイのMyMatrixを使用するmultiplyを更新することができます。

MyMatrix multiply(MyMatrix const& a, MyMatrix const& b) 
{ 
    MyMatrix ans; 
    ... 
    return ans; 
} 

関数をオーバーロードされた演算子にも変更できます。

MyMatrix operator*(MyMatrix const& a, MyMatrix const& b) 
{ 
    MyMatrix ans; 
    ... 
    return ans; 
} 

との用法簡素化:

MyMatrix a{ fill in the data for a}; 
MyMatrix b{ fill in the data for b}; 
MyMatrix c = a*b;