Duda acerca de como pasar por referencia matrices dinamicas?

Iniciado por xuhipoint, 3 Mayo 2014, 20:32 PM

0 Miembros y 1 Visitante están viendo este tema.

xuhipoint

Código (cpp) [Seleccionar]
#include <iostream>
using namespace std;
void llenar_matriz(int fil, char  &matriz[][col]){
int i,j ;
for (int i = 0; i < fil; i++){
    for (int j = 0; j < col; j++){
         
        cin >> matriz[i][j];

}
}
}

void Mostrar_matriz(int fil, char &matriz[][col] ){
int i,j;
for (i = 0; i < fil; i++)
    {
        for ( j = 0; j < col; j++){
           cout << matriz[i][j] << " ";
        cout << endl;
    }
}

}

 

int main()
{

   int fil, col ;
cout << "Dimensiones del tablero: ";
cin >> fil >> col;
char  matriz[fil][col];

}


Hola espero que estén bien, esta es mi idea de como pasar una matriz por referencia en una acción pero no entiendo porque no funciona, esto es lo que he entendido viendo videos y documentos, seria de gran ayuda que me dijeran en que me equivoco, ya que no puedo usar punteros esta fue mi idea. Gracias de antemano por sus respuestas.

Blaster

Cita de: xuhipoint en  3 Mayo 2014, 20:32 PM
como pasar una matriz por referencia en una acción pero no entiendo porque no funciona

Debes tener encuenta que cuando se pasa uan matriz a una función, esta siempre se pasa por referencia ya que su nombre hace referencia al primer elemento de la misma, es innecesario utilizar el operador (&) por lo que te he comentado anteriormente. El numero de columnas la debes indicar explicitamente para que el compilador conozca la dimensión de la matriz..


mr.blood

Aparte de lo que ya te han dicho, col y fil están declaradas dentro del ambito de  main, no de forma global. Aun así, te recomiendo que trabajes más con punteros y memoria dinámica, porque tal y como lo planteas te dará dolores de cabeza.

Sa1uDoS

leosansan

#3
Sin punteros ni asignación dinámica de memoria, una forma sería pre dimensionar la matriz para que la función tenga el tamaño de la misma, con el desperdicio de memoria que eso supone:

Código (cpp) [Seleccionar]
#include <iostream>

using namespace std;

#define FIL   10
#define COL   11


void llenar_matriz(int fil, int col,char matriz[][COL]){
 int i,j;
 for ( i = 0; i < fil; i++)
   for ( j = 0; j < col; j++){
      cout << endl << "matriz[" <<i<< "][" << j << "]=";
      cin>>matriz[i][j];
  }
}

void Mostrar_matriz(int fil, int col,char matriz[][COL] ){
 int i,j;
 for (i = 0; i < fil; i++){
   for ( j = 0; j < col; j++)
     cout << matriz[i][j]<<"  " ;
   cout << endl;
 }
}

int main(){
 int fil,col;
 char  matriz[FIL][COL];
 cout << "Dimensiones del tablero : "<< endl;
 cout << endl<< "Filas del tablero(menor 11): ";
 cin >> fil ;
 cout << endl<< "Columnas del tablero(menor 11): "<< endl;
 cin >>  col;
 llenar_matriz(fil,col,matriz);
 cout << endl;
 Mostrar_matriz(fil,col,matriz);
 return 0;
}


¡¡¡¡ Saluditos! ..... !!!!




xuhipoint

Gracias a todos por sus respuestas, al final lo que hice fue esto:
Es muy parecida a la tuya leosansan pero fue la unica idea que se me ocurrio para no utlizar punteros.

Código (cpp) [Seleccionar]
#include <iostream>
using namespace std;
int M[20][20];
void llenar(int fil,int col,int M[][20]){
int i,j;
for(i=0;i<fil;i++){
for(j=0;j<col;j++){
cout<<"["<<i<<"]"<<"["<<j<<"]"<<endl;
cin>>M[i][j];
}
}
cout<<endl;
}
void mostrar(int fil, int col, int M[][20]){
int i,j;
for(i=0;i<fil;i++){
for(j=0;j<col;j++)
cout<<M[i][j]<<" ";
cout<<endl;
}
}

int main(){
int fil,col;
cout<<"Ingrese fila y columna"<<endl;
cin>>fil>>col;
llenar(fil,col,M);
mostrar(fil,col,M);
}

MeCraniDOS

Cita de: xuhipoint en 10 Mayo 2014, 22:24 PM
Gracias a todos por sus respuestas, al final lo que hice fue esto:
Es muy parecida a la tuya leosansan pero fue la unica idea que se me ocurrio para no utlizar punteros.

Estas usando punteros de todas formas.

Esto
Código (cpp) [Seleccionar]
void Funcion(int Matriz[])

Es equivalente a esto
Código (cpp) [Seleccionar]
void Funcion(int *Matriz)

Al pasar una matriz a una funcion lo unico que haces es mandarle un puntero con la posicion de memoria donde empieza la matriz, por eso todo lo que modifiques en la matriz de la funcion, lo estas modificando en la matriz declarada en el main.

Código (cpp) [Seleccionar]
void Funcion(int *Matriz);

int main()
{
      int Matriz[5]={0}; //Inicializas todo a cero
     
      Funcion(Matriz);

      //Aqui Matriz[0] ya vale 1

      return 0;
}

void Funcion(int *Matriz)
{
      Matriz[0] = 1;
}
"La física es el sistema operativo del Universo"
     -- Steven R Garman

xuhipoint

Si al final es lo mismo, lo que pasa es que en mi universidad no quieren que use puntero porque todavía no me lo han dado por eso al final hice eso.