1

He intentado de diversas maneras, pero no encuentro como hacerlo correctamente, debo ingresar una matriz con numero de filas = numero de columnas, pero el valor es ingresado por el usuario. Gracias de antemano

Previamente almaceno el dato ingresado por el usuario

printf("Ingrese el tamanio de la matriz:");
        scanf("%d",&n);

Y posteriormente almaceno en numero, la funcion realizada con el tamaño de la matriz ingresada por el usuario

int numero= funcion(matriz[][n], n);

Pero investigando, se supone que la segunda dimension solamente debe estar detallada, sin embargo, no encuentro la manera de ingresar n como segunda dimension en la funcion. Guardo n como segundo parametro, para utilizarlo despues. A continuación lo que tengo en esa línea:

int funcion(int **matriz[][tam], int tam){
  • 2
    Por favor, coloca una **versión mínima** del código problemático junto con una descripción del problema (error de compilación, resultados esperados/obtenidos). Tal y como está, parece que estás pidiendo un ejemplo. Y ese tipo de preguntas **no** están permitidas. – Trauma Aug 18 '20 at 20:30
  • ¿Qué hace `funcion()`? ¿Has pensado en usar un puntero doble? –  Aug 18 '20 at 21:13
  • 1
    @Gabitohh Creo que sobre su uso trata la pregunta :-) – Trauma Aug 18 '20 at 21:17
  • funcion() retorna el numero mas grande de la matriz ingresada – thecesaroswing619 Aug 18 '20 at 21:22
  • Sí el número de filas y columnas se obtendrán en tiempo de ejecución, no queda de otra que crear un [array bidimensional dinámico](https://es.stackoverflow.com/questions/376010/c%c3%b3mo-funcionan-realmente-los-arrays-bidimensionales-din%c3%a1micos-en-c/376118#376118). De ahí, si quieres acceder a la matriz por medio de funciones, tocará crear un parámetro, en la cual, sea un puntero doble. Y por cierto, por ninguna razón uses [VLA](https://en.wikipedia.org/wiki/Variable-length_array) (Variable-length-Array). – MrDave1999 Aug 18 '20 at 22:19

1 Answers1

0

¿Como ingresar una matriz como parámetro a una función si el numero de filas y columnas es n?

Usando un doble puntero matas dos pájaros de un tiro:

  • Te evitas el problema de los argumentos copia
  • Obtienes una matriz flexible, ya que puedes hacer uso de memoria dinámica.

No encuentro la manera de ingresar n como segunda dimensión en la función.

Al ser un doble puntero puedes asignarle memoria dinámica al primer puntero con malloc():

int tam;
scanf("%i",&tam);
int *(*matriz) = malloc(sizeof(int*) * tam);

Con esto defines a matriz como un array de punteros. Después puedes usar el operador [] para asignarle nuevamente memoria dinámica a cada puntero del array.

void funcion(int *(*matriz),int tam) {
    for (int i = 0;i < tam;i++) matriz[i] = malloc(sizeof(int) * tam);
}

Después de esto ya tendrías un array de arrays. Aclarar que

El prototipo de funcion():

void funcion(int *(*matriz),int tam);

El uso de funcion():

funcion(matriz,tam);

Donde matriz es un doble puntero, con el primer puntero inicializado con memoria dinámica. De esta manera se puede decir que matriz es [n][n] y funcion() recibe [n][n].

Saludos.

  • 1
    Esto: `int *(*matriz) = malloc(sizeof(int) * tam);` crea un array de enteros. Para crear un array de punteros sería así: `int *(*matriz) = malloc(sizeof(int*) * tam);` – MrDave1999 Aug 18 '20 at 23:15
  • @MrDave1999 Cierto, error mío. Gracias. –  Aug 18 '20 at 23:22