2016-06-23 9 views
1

二次元配列をパラメータとする関数を宣言するには、配列の列数を指定する必要がありますが、行列のサイズがわからない場合はダブルポインタを使用します。しかし、私はこのプロセスを非常にうまく理解することはできません。誰かがこのタイプの関数の簡単で簡単な例を教えてくれますか?二次元配列をパラメータとして持つ関数

はまた、私はプログラムを書くことを試みた

ありがとう、それは私にいくつかの警告を与えます。

#include<stdio.h> 

int diagonal(int**,int);--->first note 

int main(){ 
    int N; 
    scanf("%d",&N); 
    int array[N][N]; 
    int i; 
    int j; 
    printf("Insert the numbers:\n"); 
    for(i=0;i<N;i++){ 
      for(j=0;j<N;j++){ 
      scanf("%d",&array[i][i]); 
      } 
    } 
    diagonal(&array[N][N],N); ---->second warning 
} 

int diagonal(int**A,int N){ 
    int i; 
    int condition=0; 
    for(i=0;i<N-1;i++){ 
     if(A[0][0]!=A[i+1][i+1]){ 
      return -1; 
     }else{ 
      condition=1; 
     } 
    } 
    if(condition==1){ 
     int val=A[i][i]; 
     int sum= N*val; 
     return sum; 
    } 
} 

コンパイラ出力:

3|note: expected 'int **' but argument is of type 'int *'| 

17|warning: passing argument 1 of 'diagonal' from incompatible pointer type| 


||=== Build finished: 0 error(s), 1 warning(s) (0 minute(s), 0 second(s)) ===| 

プログラムは行列をスキャンし、対角線上の要素が同じ値 リターン-1でない場合がある場合、主対角線上の要素の和を返すべきです。

答えて

2

あなたが引数として可変サイズの配列を使用したい場合は、その後、配列引数に配列のサイズとして、そのパラメータを使用し、最初のサイズを指定する必要があります。

int diagonal(int N, int A[N][N]); 

int main() { 
    ... 
    diagonal(N, array); 
} 

int diagonal(int N, int A[N][N]){ 
    ... 
} 
+0

私は申し訳ありませんが、質問がダムと聞こえるかもしれないが、私は初心者です。宣言では、 "N"パラメータを削除しませんか?私は私が置くかどうかを意味する int対角(int N、int A [N] [N]); "N"は宣言されておらず、 "N"を削除するとプログラムは実行されません。 –

+0

@GiorgioMほとんどの場合、宣言内のパラメータ名は必須ではありませんが、この場合、可変サイズの配列を処理すること、およびサイズを指定することをコンパイラに知らせる必要があります。配列パラメータを 'int [] []'として宣言しようとすると、不完全な宣言になります。 – dbush

+0

ああ、今は気にしない。 ありがとうございました と回答したすべての人にありがとう –

1

17 | warning:互換性のないポインタ型から 'diagonal'の引数1を渡す|

ここ
diagonal(&array[N][N],N); //---->warning 

&array[N][N]タイプint*が、あなたの関数定義である:(int型**、int型)対角

int型。

の最初の引数型はint**なので、のように間違った型を引数として送信しています。それがこの警告を受ける理由です。

1

あなたは間違った配列を渡しています。 &array[N][N]の代わりにarrayを渡す必要があります。 &array[N][N]を実行すると、[N] [N]配列の要素のアドレスを取得して渡すだけで、無効なアドレスになります。あなたはscanfの操作を行う際に

diagonal(array, N); 

はまた、あなたは、おそらく[i][j]要素を取得したいが、あなたは[i][i]を2回行います。

scanf("%d", &array[i][j]); 
関連する問題