Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Error al pasar matriz por referencia a función

Estas en el tema de Error al pasar matriz por referencia a función en el foro de C/C++ en Foros del Web. @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código C++: Ver original #include<iostream> #include<stdio.h> #include <stdlib.h> #include <time.h>   #define F 10 #define C 10     using namespace std ; ...
  #1 (permalink)  
Antiguo 04/11/2012, 11:05
 
Fecha de Ingreso: agosto-2012
Ubicación: Alcalá
Mensajes: 37
Antigüedad: 11 años, 7 meses
Puntos: 0
Error al pasar matriz por referencia a función

Código C++:
Ver original
  1. #include<iostream>
  2. #include<stdio.h>
  3. #include <stdlib.h>
  4. #include <time.h>
  5.  
  6. #define F 10
  7. #define C 10
  8.  
  9.  
  10. using namespace std;
  11.  
  12. int matriz[F][C];
  13.  
  14. void punto_silla (int **matriz)
  15. {
  16.      int MinCol=100, ContCol=0;
  17.      int MaxFil=0, ContFil=0;
  18.      int PuntoS=0;
  19.      for (int j=0; j<C; j++)
  20.       {
  21.       for (int i=0; i<F; i++)
  22.          if (matriz[i][j]<=MinCol)
  23.               {
  24.               MinCol=matriz[i][j];
  25.               ContCol=i;
  26.               }
  27.       for (int j2=0; j2<C; j2++)
  28.          MaxFil=MaxFil>=matriz[ContCol][j2]?MaxFil:matriz[ContCol][j2];
  29.       if (matriz[ContCol][j]==MaxFil)
  30.         {
  31.         PuntoS++;
  32.         cout<<"Hay un punto de silla ("<<matriz[ContCol][j]<<") en:"<<endl;
  33.         cout<<"Fila: "<<j+1<<'t'<<"Columna: "<<ContCol+1<<endl;
  34.         }    
  35.       }
  36.      cout<<"Hay "<<PuntoS<<" puntos de silla"<<endl;
  37. }
  38. void matriz_aleatoria()
  39. {
  40.      
  41.      
  42.       srand(time(0));
  43.       for (int i=0; i<F; i++)
  44.           for (int j=0; j<C; j++)
  45.              matriz[i][j]= rand()%100;
  46.  
  47.      
  48.      
  49.      
  50.      
  51. }
  52. void escribe_matriz(int **matriz)  
  53. {
  54.      for (int i=0; i<F; i++)
  55.           for (int j=0; j<C; j++)
  56.           {
  57.           cout<<matriz[i][j]<<'t';
  58.           cout<<endl;
  59.           }
  60.      
  61. }  
  62. int main()
  63. {
  64.  
  65.     matriz_aleatoria();
  66.     escribe_matriz(&matriz);
  67.     punto_silla (&matriz);
  68.    
  69.     system("PAUSE");
  70.     return EXIT_SUCCESS;
  71.  
  72. }

Buenas, este programita me da los siguientes errores:

Linea 66 cannot convert `int (*)[10][10]' to `int**' for argument `1' to `void escribe_matriz(int**)'
Línea 67 cannot convert `int (*)[10][10]' to `int**' for argument `1' to `void punto_silla(int**)'

y no sé qué quieren decir, supongo que hay algo mal en los punteros...
Se podría hacer sin punteros? y sin declarar la matriz como variable global? intenté generar la matriz aleatoriamente con matriz_aleatoria y luego hacer un return para llevarla a main pero no hubo manera..

Agradezco vuestros comentarios. Un saludo.
  #2 (permalink)  
Antiguo 04/11/2012, 16:44
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Error al pasar matriz por referencia a función

Primero de todo lo la declaras de forma global no tenes la necesitada de pasarla por argumento.
Fuera de eso tenes errores de tipo. Las llamadas a las funciones deberia ser:

escribe_matriz(matriz);
punto_silla (matriz);

Ya que matriz por si solo es un doble puntero a int.
  #3 (permalink)  
Antiguo 06/11/2012, 17:05
 
Fecha de Ingreso: agosto-2012
Ubicación: Alcalá
Mensajes: 37
Antigüedad: 11 años, 7 meses
Puntos: 0
Respuesta: Error al pasar matriz por referencia a función

Ahora he puesto la matriz en main y la he puesto como argumento de las funciones primero sin & y luego con &.

Código C++:
Ver original
  1. int main()
  2. {  
  3.     int matriz[F][C];
  4.     matriz_aleatoria(matriz);
  5.     escribe_matriz(matriz);
  6.     punto_silla (matriz);
  7.    
  8.     system("PAUSE");
  9.     return EXIT_SUCCESS;
  10.  
  11. }

En la lista de argumentos de las funciones he puesto el puntero int **matriz:

Código C++:
Ver original
  1. void escribe_matriz(int **matriz)  
  2. {
  3.      for (int i=0; i<F; i++)
  4.           for (int j=0; j<C; j++)
  5.           {
  6.           cout<<matriz[i][j]<<'t';
  7.           cout<<endl;
  8.           }

pero en todos los casos me da error 65 cannot convert `int (*)[10]' to `int**' for argument `1' to `void matriz_aleatoria(int**)' en cada función...

No entiendo cómo se hace esto. Sólo quiero pasar una matriz como argumento a una función pero no lo consigo ni por referencia ni por valor. Alguien me lo podría explicar, qué falla??

Gracias
  #4 (permalink)  
Antiguo 06/11/2012, 18:48
Avatar de cotolon  
Fecha de Ingreso: octubre-2012
Mensajes: 55
Antigüedad: 11 años, 5 meses
Puntos: 10
Respuesta: Error al pasar matriz por referencia a función

Estuve leyendo un poco y la mejor forma es declarar un puntero bidimensional en main y pasar ese como referencia a la función, así queda el código (si funciona)

Código C++:
Ver original
  1. #include<iostream>
  2. #include<stdio.h>
  3. #include <stdlib.h>
  4. #include <time.h>
  5.  
  6. #define F 10
  7. #define C 10
  8.  
  9.  
  10. using namespace std;
  11.  
  12.  
  13. void punto_silla (int **matriz)
  14. {
  15.      int MinCol=100, ContCol=0;
  16.      int MaxFil=0, ContFil=0;
  17.      int PuntoS=0;
  18.      for (int j=0; j<C; j++)
  19.       {
  20.       for (int i=0; i<F; i++)
  21.          if (matriz[i][j]<=MinCol)
  22.               {
  23.               MinCol=matriz[i][j];
  24.               ContCol=i;
  25.               }
  26.       for (int j2=0; j2<C; j2++)
  27.          MaxFil=MaxFil>=matriz[ContCol][j2]?MaxFil:matriz[ContCol][j2];
  28.       if (matriz[ContCol][j]==MaxFil)
  29.         {
  30.         PuntoS++;
  31.         cout<<"Hay un punto de silla ("<<matriz[ContCol][j]<<") en:"<<endl;
  32.         cout<<"Fila: "<<j+1<<'t'<<"Columna: "<<ContCol+1<<endl;
  33.         }
  34.       }
  35.      cout<<"Hay "<<PuntoS<<" puntos de silla"<<endl;
  36. }
  37. void matriz_aleatoria(int **matriz)
  38. {
  39.  
  40.  
  41.       srand(time(0));
  42.       for (int i=0; i<F; i++)
  43.           for (int j=0; j<C; j++)
  44.              matriz[i][j]= rand()%100;
  45.  
  46.  
  47.  
  48.  
  49.  
  50. }
  51. void escribe_matriz(int **matriz)
  52. {
  53.      for (int i=0; i<F; i++)
  54.           for (int j=0; j<C; j++)
  55.           {
  56.           cout<<matriz[i][j]<<'t';
  57.           cout<<endl;
  58.           }
  59.  
  60. }
  61. int main()
  62. {
  63.     int matriz[F][C];
  64.     //Creamos puntero de la matriz para pasar el puntero:
  65.     int **pmatriz;
  66.     //Array de punteros a int (A las filas solamente)
  67.     pmatriz = new int*[F];
  68.     //F "Cajones" de C ints (Ahora a las columnas)
  69.     for(int x = 0; x < F; x++)
  70.         pmatriz[x] = new int[C];
  71.  
  72.     matriz_aleatoria(pmatriz);
  73.     escribe_matriz(pmatriz);
  74.     punto_silla (pmatriz);
  75.  
  76.     system("PAUSE");
  77.     return EXIT_SUCCESS;
  78.  
  79. }

Etiquetas: int, matriz, punteros, referencia, variables
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:37.