Modificación de matrices en funciones

Modificación de matrices en funciones

de Santiago Quinteros Vargas -
Número de respuestas: 2

Dentro de una función de parametros (A,Ainv) use una matriz auxiliar Aaux y al final de la función puse Ainv=Aaux. Si lo hago así dentro de la función Ainv se modifica pero fuera no.

Sin embargo si no uso Aaux y hago toda la función manipulando Ainv directamente, entonces esta se modifica afuera y adentro de la función.

¿Por qué en el primer caso no se modifica Ainv fuera de la función y en el segundo si?

En respuesta a Santiago Quinteros Vargas

Re: Modificación de matrices en funciones

de Leopoldo Agorio -
Estimado, tal vez aún no lo han dado en clase, pero el problema que planteas tiene que ver con el scope (o alcance) de las variables, y la asignación de punteros en C.
Puedes googlear esos conceptos o mirar aqui para mas: https://www.tutorialspoint.com/cprogramming/c_scope_rules.htm

Lo que está sucediendo en tu caso es que la variable Aaux tiene un alcance limitado a la función invertir. La asignación = para arreglos (Ainv = Aaux) copia la dirección del puntero asociado al arreglo, es decir, ahora Ainv apunta a la misma dirección de memoria que apunta Aaux. El problema es que como el alcance de Aaux se restringe a la función invertir, una vez que se retorne de la función invertir, el puntero a Aaux se libera, y como Ainv solo estaba apuntando a su misma dirección, vuelve a quedar ´flotando´ por así decir.

Como tú bien dices la solución esperada es trabajar directamente sobre Ainv, pero si te quedaba cómodo copiar una variable auxiliar con alcance local, no queda más remedio que la estrategia conocida como deepcopy (copia profunda): se debe copiar elemento a elemento, de forma de no modificar la dirección de memoria asociada al puntero Ainv, sino los valores de cada elemento apuntado (deberías hacer Ainv[0][0] = Aaux[0][0]; Ainv[0][1] = Aaux[0][1];... etc, etc. notar que se puede hacer o bien con nueve sentencias o bien con dos fors anidados).


Si los detalles se te escapan es porque ya se verá más adelante en el curso. Cualquier otro comentario, a las órdenes