2016-08-22 10 views
-1

Я написал небольшую программу 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 напрямую, но то же предупреждение.

Как я могу передать массив функции?

+4

Я думаю, ваш вопрос «почему» const int (*) [4] 'несовместим с' int (*) [4] '"? –

+0

В дубликате тип указателя отличается, но причины одинаковы. – 2501

+0

Код в этом вопросе делает *** не *** генерировать любые предупреждения, даже если они скомпилированы с '-Weverything'. – user3386109

ответ

-1

Я думаю, что ответ наиболее четко прописано в выводе компилятора:

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

Тип INT, на самом деле, довольно сильно отличается от сопзЬ Int. Ваш код может считаться ошибкой, если вы попытаетесь изменить любой const (например, назначить ему), но, очевидно, вы можете изменить int. Моя рекомендация не будет использовать const, если вы не знаете, что делаете, что может потребовать некоторого изучения, поскольку const усложняется по мере усложнения типов.

+0

Спасибо за ваш ответ. Я изменил 'SumOF2DArray()' на \t int SumOf2DArray (int array [] [COLS], int rows); и предупреждение исчезло. Однако это не то, что я хочу. 'SumOF2DArray()' не изменит значение 'array [] [COLS]', поэтому я считаю, что это хороший стиль для добавления 'const' в функцию. что меня смущает, так это то, что 'SumOfArray()' также имеет 'const', но никакого предупреждения. –

+0

ну, вы определили линию с проблемой, но ваш пояснительный пункт на самом деле не имеет никакого отношения к вопросу. Код не пытается изменить какой-либо const ints –

+0

Поскольку я понял вопрос, «проблема» была предупреждением компилятора, а не поведением программы. Поэтому я считаю, что поведение программы не зависит от темы. (Конечно, все программисты хотят убедиться, что их программы ведут себя правильно все время, поэтому мне не нужно напоминать об этом, не так ли?). Тем не менее, способ, которым код «фиксирован» не генерировать предупреждение, не должен изменять результаты. В общем случае dropping const никогда не сделает этого, если не будет другой ошибки - это может повлиять на производительность/footprint. –