2016-10-30 7 views
1

私はこの宿題を持っています。基本的には、 'r'行と 'n'列の二次元配列の最大要素を返す次のコードを完成させるだけです。マトリックス内の最大要素を見つける

  • が互換性のないポインタ型から 'max_element' の引数1を通過[-Wincompatibleポインタ・タイプ]

コンソールが動作を停止:

#include <stdio.h> 

int max_element(int **A, int r, int n) { 
// complete the code 
int max; 
max = a[0][0]; 
for (int i = 0; i < r; i++) { 
    for (int j = 0; j < n; j++) { 
     if (A[i][j] > max) 
      max = A[i][j]; 
    } 
} 
return max; } 

// implement a main() function to test the algorithm 
int main() { 
int A[2][3] = { {1, 0, 4}, {10, 3, 1} }; 

printf("%d\n", max_element(&A, 2, 3)); 
return 0; } 

私は1回の警告を持っている問題をプログラムが正常に機能しなくなりました...

+0

コンパイラによってスローされた警告には、ソリューションの鍵があります。 – abhiarora

答えて

1

max_element関数は次のように定義されています:

int max_element(int **A, int r, int n); 

それはintへのポインタへのポインタ(int**)を取り、あなたはそれにこれを供給しています

int A[2][3]; 
max_element(&A, 2, 3); 

あなたが表現&Aがタイプint**の結果を得るために期待していますか?ならない。実際にはタイプint(*)[2][3]の結果が得られます。それはint**に縛られません。これは、コンパイラの警告がどこで起きるかです。これらは互換性のないポインタです!

しかし、あなたはもっと広い問題があります。 2D配列はint**ではありません。タイプはint[][COLS]です。 の2番目の番号を指定する必要があります。

const int COLS = 3; 

int max_element(int A[][COLS], int r, int n); 

、その後のように呼び出します:

変更あなたの機能があることを

max_element(A, 2, 3); 
+0

あなたのアルゴリズムには何も問題はありません。 'max = a [0] [0]'のタイプミスを除き、 'max = A [0] [0]'でなければなりません。あなたのコンパイラはあなたに叫んでいませんか? – DeiDei

0

Changeからmax_elementの関数プロトタイプ:

int max_element(int **A, int r, int n) 

int max_element(int A[][3], int r, int n) 

このC-Faqは、理由を完全に説明しています。その要点は、配列は一度ポインタに崩壊するということです。再帰的に起こるわけではありません。配列の配列は、ポインタへのポインタではなく、配列へのポインタに減衰します。

また、max_element(&A, 2, 3)の代わりにmax_elementmax_element(A, 2, 3)と呼びます。

関数が(あなたの場合のように)ポインタへのポインタを受け入れるように既に宣言されている場合は、2次元配列を直接渡すことはほとんど意味がありません。 2次元配列とそれを呼び出そうとしたときにintermediate pointerを使用しなければならないであろう。

int max_element(int **A, int r, int n); 

int *ip = &A[0][0]; 
max_element(&ip, 2, 3);  /* PROBABLY WRONG */ 

が、配列はflattenedits shape has been lost)となっているので、この使用法は、誤解を招くとほぼ確実に間違っています。

+0

したがって、中間のポインタを使用すると、配列の配列が配列へのポインタにのみ崩壊するため、機能しません。エラーは、彼が機能するプロトタイプにあった。しかし、関数が既にポインタへのポインタとして宣言されている場合、どのように私はメインを実装する必要がありますか?中間ポインタはコンパイルされますが動作しません。 – Orion