Cuando aparece una expresión de matriz en la mayoría de contextos, su tipo se convierte implícitamente de "N-elemento matriz de T" a "puntero a T", y su valor se establece en la dirección del primer elemento en la matriz. Las excepciones a esta regla son cuando la expresión de matriz es un operando de los operadores sizeof
o address-of (&
), o si la expresión de matriz es un literal de cadena que se utiliza para inicializar otra matriz en una declaración.
Lo que esto significa en el contexto de su código es que en su llamada a box_sort
, el tipo de la expresión boxes
se convierte implícitamente de M-element array of N-element array of int
a pointer to N-element array of int
, o int (*)[MAX_DIMENSIONALITY+1]
, por lo que su función debe estar esperando tipos de parámetros como:
void box_sort(int (*arr)[MAX_DIMENSIONALITY+1], int x, int y)
{
...
}
Desde int *a
y int a[]
son sinónimos de una declaración de parámetros de función, se deduce que int (*a)[N]
es sinónimo de int a[][N]
, por lo que podría escribir lo anterior como
void box_sort(int arr[][MAX_DIMENSIONALITY+1], int x, int y)
{
}
aunque personalmente prefiero la notación del puntero, ya que refleja con mayor precisión lo que está sucediendo. Tenga en cuenta que en su función, que le subíndice arr
como normales:
arr[x][y] = ...;
ya que la expresión es equivalente a arr[x]
*(arr + x)
, el puntero se elimina la referencia implícita.
Si desea box_sort para trabajar en matrices arbitraria de tamaño (es decir, matrices, donde la segunda dimensión no es necesariamente MAX_DIMENSIONALITY + 1), a continuación, un enfoque consiste en hacer lo siguiente:
int boxes[X][Y];
...
box_sort (&boxes[0], X, Y, x, y);
...
void box_sort(int *arr, size_t rows, size_t cols, int x, int y)
{
...
arr[x*cols + y] = ...;
}
Básicamente, está tratando boxes
como una matriz de 1-d de int y calculando los desplazamientos manualmente.
¿Qué son 'MAX_BOXES' y' MAX_DIMENSIONALITY'? ¿Son macros, constantes, ...? – Jacob