Red de conocimiento informático - Conocimiento informático - Cómo llamar a una matriz bidimensional a través de una función

Cómo llamar a una matriz bidimensional a través de una función

En el proceso de programación en lenguaje C, es inevitable encontrar la situación en la que se utilizan matrices bidimensionales o más bidimensionales como referencias de funciones. En el proceso de programación anterior, estaba acostumbrado a usar matrices dinámicas, y muchos solían hacerlo directamente. definir matrices de alta dimensión. Recientemente, encontré un problema de este tipo durante el proceso de programación: existe el siguiente programa de prueba:

voidtest (double?**x, int?Row, int?Col

); voidtest (double ?**x)

{ for (int?i=0; ilt; Row; i )

for (int?k=0; klt; Col; k )

x[i][k]? =?100.0;

}

intmain(int?argc,?char?*argv[])

{

/* ¿doble?**x;

x?=?¿nuevo?doble?*[3];

para (int? i=0; ilt; 3; i ) x[i]? =?nuevo?doble[3];

*/

doble?x[3][ 3]; para(int?i =0;ilt;3;i)

para(int?k =0;klt;3;k)

x[i][ k]? =?i*k; prueba(x,3,3); para(int?i=0;ilt;3;i)

para(int?k=0;klt;3 ;k)

printf("x[d][d]=? e\n",i,k,x[i][k]);

getch() ;

getch();

p>

return?;

}

Al compilar, aparece el mensaje "No se puede convertir 'double[*][3]' a 'double[**]'.

p>

Conversión de tipo de llamada forzada: test((double?**)x) se compila correctamente, pero se produce una salida ilegal. Se produce un error de límites durante el tiempo de ejecución.

Se rumorea que debido a que la matriz asignada en la pila está en el montón, la disposición de la memoria de las matrices asignadas puede ser diferente. área de pila del programa, y ​​los datos ocupan un intervalo continuo, mientras que la matriz aplicada dinámicamente está en el montón más lejano (lejos? montón) del sistema, excepto el último Excepto que los elementos de una dimensión se almacenan continuamente. los elementos de otras dimensiones pueden no estar en un área de memoria continua

// Stack:?

intia[2][2]=. 5}; // ¿4 elementos en un segmento de memoria continuo?

// En el montón: ?

int**p =? int?i?=?0;?i?lt;?2;?i ?) ?

{?

p[i ]=?nuevo?int[2]; ?

}? para(?int?i?=?0;?i?lt;?2;?i?) ?

{? para?(?int?j?=?0;?j?lt;?2;?j ?) ?

{?

p[i][j]=ia [i][j];?

}?

}? Entonces, para matrices en la pila, use int?**p apunta a la primera dirección, porque int?* *p se desreferencia una vez como puntero a una dirección, no como puntero a una matriz en el montón, por lo que una segunda desreferencia sería un error.

Si buscas una ecuación general, sólo puedes usar "...": ?

voidf(?int?*p, ?int?row, ?int? col?)?

{?

for(?int?i?=?0;?i?lt;?row;?i )?

{?

for(?int?j?=?0;?j?lt;?col;?j ?) ?

{?

cout ?

cout?

}?

}?

intmain(){?

//. ........?

intia[2][2]=?{2, 3, 4, 5};?

f(? ( int*) ia,?2,?2?);?

}

Todavía es problemático utilizar el método genérico anterior, lo que prácticamente aumenta la dificultad de programación para evitarlo. Para resolver este problema, puede usar matrices dinámicas y reemplazar todas las matrices definidas directamente con matrices dinámicas, similar al código comentado al comienzo del ejemplo. Por supuesto, habrá problemas más adelante. completado, debes Liberar espacio en la memoria también es un poco complicado. Liberar el espacio de memoria después de que se completa el ciclo de vida de la matriz dinámica es un poco detallado, pero después de todo, puede usar la matriz directamente, que es más simple que el método general anterior. ¿Qué pasa si insistes en usar matrices definidas directamente? Existen varios métodos:

Método 1:

voidtest(double?(*x)[3], ?int?Row, ?int?Col);

llamar con el método ?test(x, Row, Col);

llamar con el método ?test(x, Row, Col);

llamar con el método ?

Método 2:

voidtest(double?x[][3], ?int?Row, int?Col);

Usar el patrón ?test(x, Row, Col) call;

Para matrices multidimensionales como parámetros, se deben especificar dimensiones distintas a la primera dimensión; de lo contrario, definitivamente no se compilará. A juzgar por las referencias anteriores a matrices definidas directamente, es más problemático utilizar matrices definidas directamente. Una vez que cambian las dimensiones de la matriz definida directamente, la definición de la función debe modificarse en consecuencia; de lo contrario, el programa saldrá mal, lo que también aumentará. Para un mayor desarrollo del programa, para resolver el problema de una vez por todas, se recomienda utilizar el método de matriz dinámica. Por supuesto, es necesario liberar la memoria manualmente. Lo anterior es la "Matriz dinámica en el desarrollo de programas" que le presentó el editor. Espero que le resulte útil.