• Martes 12 de Noviembre de 2024, 20:38

Autor Tema:  Consulta c++: arrays como parámetros y retornos en funciones  (Leído 1173 veces)

yopicuo

  • Nuevo Miembro
  • *
  • Mensajes: 5
  • Nacionalidad: es
    • Ver Perfil
Consulta c++: arrays como parámetros y retornos en funciones
« en: Domingo 15 de Noviembre de 2009, 19:33 »
0
Hola, necesito ayuda sobre trabajo con funciones... les comento...

Bueno, estoy intentado hacer un programita (para muchos, seguro que es algo muy simple) donde se combinen diferentes llamamientos a funciones... básicamente el programa debe hacer lo siguiente:
1º Crear una matriz de rango [r][r+1] y un vector de rango.
2º Una función debe mostrar por pantalla el contenido del array matriz en función del orden de vector creado.
3º Otra Función debe permitir modificar el vector y devolverlo modificado.
4º Y otra función que devuelva una matriz, de entrada como parámetro, con sus valores modificados.
 
La estructura del mismo queda algo talque así..
Código: C++
  1.  
  2.  
  3. int muestra_matriz(int r, double **matriz, int *V)
  4. {
  5.    int i,j;
  6.    for (p = 0; p < r; p++)
  7.    {
  8.       for (l=0; l<r+1;l++)
  9.        {
  10.            cout << matriz[V[i]][j] << " | " ;   /** MUESTRA EL VECTOR SEGÚN EL ORDEN DE FILAS EXISTENTE EN ARRAY "V"*/
  11.        }  
  12.        cout <<endl;
  13.    }
  14. }
  15. ########### 
  16. int modifica_vector (int *V,int r)
  17. {
  18. ...algoritmo simple...
  19. return [b]¿¿¿ cómo hago para que devuelve el vector modificado??[/b]
  20. }
  21. ###########
  22. int modifica_matriz(double **M, int r)
  23. {
  24. ...algoritmo simple...
  25. return [b]¿¿¿ cómo hago para que devuelve la matriz modificada??[/b]
  26. }
  27. /**************************************************************************************/
  28. int main()
  29. {
  30. int r;
  31.  
  32. cout << "determinar rango de matriz";
  33. cin >> r;
  34. double matriz[r][r+1];    
  35. int Vec_filas [r];
  36.  
  37. ... algoritmo para rellenar array matriz ...
  38. ... algoritmo para rellenar array vector...
  39.  
  40. muestra_matriz(r,matriz,Vec_filas);      /* El complilador me dá error en esta línea: "cannot convert `double (*)[(((unsigned int)((int)r)) + 1u)]' to `double**' for argument `2' to `int muestra_matriz(int, double**, int*)' "*/
  41. modifica_vector (Vec_filas,r);  /* obtengo error similar al anterior*/
  42. modifica_matriz(matriz,r); /* obtengo error similar al anterior*/
  43.  
  44. return 0;
  45. } 
  46.  
  47.  

Mis pregunta es: ¿cual es la forma correcta de emplear un arrary[][] y otro tipo vector como parámetros de una función? y ¿Cómo hacer para que una función devuelva un array del tipo que sea?


Un saludo y gracias....

diego.martinez

  • Miembro MUY activo
  • ***
  • Mensajes: 297
    • Ver Perfil
Re: Consulta c++: arrays como parámetros y retornos en funciones
« Respuesta #1 en: Lunes 16 de Noviembre de 2009, 20:22 »
0
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:
Código: C++
  1.  
  2. double matrix[n][n+1];
  3.  
  4.  

estas localizando un cacho de memoria de n*(n+1)*sizeof(double), que van todos segudos. Cuando usas un operador corchete, realmente dices:

Código: C++
  1.  
  2. matrix[5][6];
  3.  
  4.  
es lo mismo que:
Código: C++
  1. *(matrix+sizeof(double)*5*6);
  2.  

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).