recibe - Pasar matriz multidimensional a una función C
matrices en c (6)
Bueno, es incompatible por definición.
char[20][7]
no es lo mismo que char[][7]
solo deshazte de la advertencia.
Y no está pasando "solo la primera matriz de la matriz 2D", sino que está pasando solo un puntero a la matriz (puntero al primer elemento o al comienzo de la matriz). Puede ver solo los primeros 7 elementos en GDB porque según el tipo de matriz dentro de la función, GDB solo conoce 7 elementos.
Tengo problemas para pasar una matriz multidimensional a una función en C. Tanto en typedef como en qué argumento debería ser.
Actualmente, mi función def se ve así:
int foo(char *a, char b[][7], int first_dimension_of_array);
Declaro una matriz como esta:
char multi_D_array[20][7];
Cuando intento llamar a la función de esta manera:
foo(d, multi_D_array, 20);
Recibo la advertencia de que el segundo argumento para la función es del tipo de puntero incompatible. He intentado muchas de las variaciones que he visto en línea pero aún no puedo corregirlas. Además, cuando uso GDB, descubro que solo se transfiere la primera matriz de la matriz 2D. Sería muy útil recibir comentarios sobre lo que estoy haciendo mal.
Gran advertencia: normalmente no manejaría matrices multidimensionales de esta manera.
Intenté esto solo para verificarlo, pero esto:
#include <stdio.h>
int foo(char b[][7])
{
printf("%d/n", b[3][4]);
return 0;
}
int main(int argc, char** argv)
{
char multi_d_arr[20][7];
multi_d_arr[3][4] = 42;
foo(multi_d_arr);
return 0;
}
Compila y ejecuta sin ningún problema, usando gcc -Wall
. No estoy seguro, honestamente, cómo el segundo argumento puede considerarse un tipo de puntero incompatible. Funciona bien.
Sin embargo, ya que preguntas, ¿cómo manejaría arreglos en 2-D? Una mejor manera es usar punteros como ese:
char** array2d = malloc((MAX_i+1)*sizeof(char*));
for ( i = 0; i < (MAX_i+1); i++ )
{
array2d[i] = malloc((MAX_j+1)*sizeof(char));
}
Ahora, para ser claros, el mejor elemento al que puede acceder es array2d[MAX_i][MAX_j]
.
No olvides invertir el proceso cuando hayas terminado:
for ( i = 0; i < (MAX_i+1); i++ )
{
free(array2d[i]);
}
free(array2d);
Ahora, usando este método, la notación del subíndice sigue siendo válida, por lo que array2d[x][y]
todavía tiene acceso al valor correcto. Literalmente, array2d
es una matriz de punteros, al igual que cada array2d[i]
.
¿Por qué es este un mejor método? Bueno, puedes tener sub-arrays de tamaño variable si así lo deseas. Todo lo que tienes que hacer es cambiar el for-loop. Esta tecnología se usa a menudo para matrices de cadenas, particularmente en la firma int main(int argc, char** argv)
de una aplicación. argv
es una matriz de una serie de cadenas de longitud variable. Use strlen()
para determinar su longitud.
Puedes pasar esto? Por supuesto. Acabas de recibirlo en main, para empezar, pero también puedes escribir la firma de tu función así:
int foo(char** ar2d, const unsigned int size);
y llámalo:
char** somearray;
/* initialisation of the above */
foo(ar2d, thesizeofar2d);
/* when done, free somearray appropriately */
Para que quede claro, su método para incluir parámetros de tamaño (como const unsigned int size
) es una muy buena práctica y debe mantenerlo.
La conclusión es que C / C ++ no funciona bien con matrices multidimensionales. La mayoría de las veces es más fácil tenerlo como una matriz de una sola dimensión y hacer la dirección de la fila por ti mismo.
La convocatoria de declaraciones y funciones que ha realizado en su pregunta es perfectamente correcta C, y no da una advertencia con gcc.
¿Estás seguro de haber copiado exactamente el código problemático?
Tu código funciona bien para mí? Aquí está mi código de prueba: http://codepad.org/wSppLiwl
A partir de C99 puede tener matrices de longitud variable y hacer cosas como a continuación. Básicamente, el parámetro proporcionado para la matriz de dimensiones se utiliza para declarar el tamaño de la matriz. Este es probablemente el mejor enfoque para los compiladores modernos.
#include <stdio.h>
int foo(char *a, int fdim, char b[fdim][7]){
printf("b[19][6] = %d/n", b[19][6]);
return 0;
}
int main(){
char d[10];
char multi_D_array[20][7];
int x, y;
for (x = 0 ; x < 7 ; ++x){
for (y=0 ; y < 20 ; ++y){
multi_D_array[y][x] = y + x;
}
}
foo(d, 20, multi_D_array);
}
Incluso si también se aplica a C ++, también podría interesarle leer mis respuestas allí y allá (y ciertamente las respuestas de otros) para una mejor comprensión de las matrices en C.