-1

私は小さなCプログラムを書いていました。コードは GCC 4.8.5 20150623 (Red Hat 4.8.5-4) で正常にコンパイルされました-std=c99が、警告が表示されました。警告に対処できず、何が問題なのかさえわかりません。コードは次のとおりです。

#include <stdio.h>
#define COLS 4
int SumOf2DArray(const int array[][COLS], int rows);
int SumOfArray(const int array[], int element_number);
int main(void) {
  int sum_of_array0, sum_of_2d_array, sum_of_array1;
  int *array, (*dimensions)[COLS];
  array = (int [2]){10, 20};
  dimensions = (int [2][COLS]){{1, 2, 3, -9}, {4, 5, 6, -8}};
  sum_of_array0 = SumOfArray(array, 2);
  sum_of_2d_array = SumOf2DArray(dimensions, 2);
  sum_of_array1 = SumOfArray((int []){4, 4, 4, 5, 5, 5}, 6);
  printf("sum_of_array0 = %d \t sum_of_2d_array = %d \t sum_of_array1 = %d\n",
    sum_of_array0, sum_of_2d_array, sum_of_array1);
  return 0;
}
int SumOf2DArray(const int array[][COLS], int rows) {
  int sum_of_2d_array = 0;
  for (int rows_i = 0; rows_i < rows; rows_i++) {
    for (int cols_i = 0; cols_i < COLS; cols_i++) {
      sum_of_2d_array += array[rows_i][cols_i];
    }
  }
  return sum_of_2d_array;
}
int SumOfArray(const int array[], int element_number) {
  int sum_of_array = 0;
  for (int i = 0; i < element_number; i++) {
    sum_of_array += array[i];
  }
  return sum_of_array;
}

そして警告はここにあります:

chapter10_compound_literals.c: In function ‘main’:
chapter10_compound_literals.c:25:3: warning: passing argument 1 of ‘SumOf2DArray’ from incompatible pointer type [enabled by default]
   sum_of_2d_array = SumOf2DArray(dimensions, 2);
   ^
chapter10_compound_literals.c:15:5: note: expected ‘const int (*)[4]’ but argument is of type ‘int (*)[4]’
 int SumOf2DArray(const int array[][COLS], int rows);

ここで、2d-array:int array[2][3] = {{1, 2, 3}, {3, 4, 5}}と function: があるとしますint SumOf2DArray(const int array[][3], int rows)

上記のコードでは、pointer( int (*pointer)[3] = array) を使用していますが、警告が表示されます。直接使用して引数を渡そうとしましarrayたが、同じ警告が表示されます。

配列を関数に渡すにはどうすればよいですか?

4

1 に答える 1

-1

答えは、コンパイラの出力に最も明確に記載されていると思います。

expected ‘const int (*)[4]’ but argument is of type ‘int (*)[4]’

実際、型intはconst intとはかなり異なります。constを変更しようとすると(たとえば、代入)、コードにバグがあると見なされる可能性がありますが、明らかにintを変更できます。私の推奨は、自分が何をしているのかを理解していない限り、constを使用しないことです。これには、型が複雑になるにつれてconstも複雑になるため、ある程度の調査が必要になる場合があります。

于 2016-08-22T19:35:48.860 に答える