pasar - funciones con vectores c++



Pasar matriz multidimensional a una función C (4)

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 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?






multidimensional-array