Respecto a la duda de la devolucion:
El problema esta en el paso de parametros.
Un poco de teoria, cuando localizas una matriz, realmente estas localizando un cacho de memoria lineal, de x*y elementos de z de tamaño.
estos elementos se ponen en orden lineal desde el puntero inicial.
asi, cuando haces:
estas localizando un cacho de memoria de n*(n+1)*sizeof(double), que van todos segudos. Cuando usas un operador corchete, realmente dices:
es lo mismo que:
*(matrix+sizeof(double)*5*6);
o sea, buscame un elemento que esta a 5 veces el tamaño de una fila, + un offset de 6 elementos de tamaño double.
Basandonos en esto, para pasar una matriz, solo tenemos que mandar el puntero inicial al primer elemento, que es igual a su propio nombre.
o sea:
matrix = matrix[0][0];
luego, si quieres mandar la matriz como parametro, puedes decir
muestra_matriz(r,matriz,Vec_filas).
y como devolucion, puedes hacer
return matrix;
Por que da error entonces? no estoy muy seguro.
por que seguramente, tienes definido r como una operación, y no puede resolver correctamente el formato de la matriz en el momento que la usas.
creo que esta expandiendo una macro en mitad del paso de parametros, asi que no le da correctamente el formato al usarla.
Pon &(matrix[0]) y asi pasaras el puntero al primer elemento (que es un puntero).