Я написал небольшую программу c. Код успешно скомпилирован GCC 4.8.5 20150623 (Red Hat 4.8.5-4) с -std=c99
, но дал мне предупреждение. Я не могу справиться с предупреждением, и я даже не знаю, что с ним не так. Код здесь:C - используйте 2d-массив в качестве аргумента
#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-массив: int array[2][3] = {{1, 2, 3}, {3, 4, 5}}
, и у меня есть функция: int SumOf2DArray(const int array[][3], int rows)
.
Путь в коде выше используется указатель (int (*pointer)[3] = array
), но получите предупреждение, и я попытался передать аргумент, используя array
напрямую, но то же предупреждение.
Как я могу передать массив функции?
Я думаю, ваш вопрос «почему» const int (*) [4] 'несовместим с' int (*) [4] '"? –
В дубликате тип указателя отличается, но причины одинаковы. – 2501
Код в этом вопросе делает *** не *** генерировать любые предупреждения, даже если они скомпилированы с '-Weverything'. – user3386109