Pass ein zweidimensionales Array zu einer Funktion des konstanten Parameters
Ich habe von @ gelerC Primer Plus Wenn Sie verhindern möchten, dass ein Array versehentlich von einer Funktion geändert wird, sollten Sie @ hinzufügeconst
-Modifikator vor der Zeigerdeklaration im Header der Funktionsdefinition.
Folgend diesem sinnvollen Rat, versuche ich im folgenden minimalen Beispiel, ein nicht konstantes zweidimensionales Array zu übergebenarray
zur FunktionSum2D
, ein Parameter davon ist einpointer-to-const-int[2]
.
#include <stdio.h>
#define ROWS 2
#define COLS 2
int Sum2D(const int ar[][COLS], int rows); //use `const` to protect input array
int main(void)
{
int array[ROWS][COLS]={{1,2},{3,4}}; //the non-constant array
printf( "%d\n", Sum2D(array,ROWS) );
return 0;
}
int Sum2D(const int ar[][COLS], int rows)
{
int total=0;
int i,j;
for( i=0 ; i<rows ; i++ )
{
for( j=0 ; j<COLS ; j++ )
{
total+=ar[i][j];
}
}
return total;
}
Jedoch,gcc
kann diesen Code nicht erfolgreich kompilieren, ohne die folgenden Warnungen auszugeben:
$gcc -ggdb3 -Wall -Wextra -o test test.c
test.c: In function ‘main’:
test.c:16:2: warning: passing argument 1 of ‘Sum2D’ from incompatible pointer type [enabled by default]
printf( "%d\n", Sum2D(array,4) );
^
test.c:4:5: note: expected ‘const int (*)[4]’ but argument is of type ‘int (*)[4]’
int Sum2D(const int ar[][COLS], int rows);
^
1) Warum die Warnung?
2) Wie kann ich das "Rauschen" beseitigen? (Abgesehen vom Hinzufügen vonconst
zuarray
Erklärung.)
(Wenn dasarray
und Funktion verwenden beide eindimensionale Arrays, es gibt keine Warnung.)
System Information
Ubuntu 14.04LTS
Compiler: gcc 4.8.2