SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: Garethsoul en Miércoles 27 de Enero de 2010, 01:44

Título: Hola problema con la utilizacion de punteros+array+funciones
Publicado por: Garethsoul en Miércoles 27 de Enero de 2010, 01:44
Buenas

Necesitaría ayuda con la utilización de punteros para pasar un array a una funcion. Porque se me es facil hacer el ejercicio si esta dentro del main() EJEMPLO:
-------------------
Código: Text
  1.  
  2. #include <iostream>
  3. using namespace std;
  4.  
  5.  
  6. int main(){
  7.  
  8.     int a, b,i,j;
  9.     a=b=0;
  10.     int **m;
  11.  
  12.     cout<<"Ingrese la cantidad de Filas seguido de la cantidad de columnas de la Matriz"<<endl;
  13.             cin>>a>>b;
  14.     m = new int *[a]; // array de A punteros a int
  15.     for(int i=0;i<a+1;i++)m[i]= new int[b]; // m es un array de [a]*[b]
  16.  
  17.     cout<<"Ingrese la matriz por filas"<<endl;
  18.     for(i=0;i<a;i++){
  19.         for(j=0;j<b;j++)
  20.             cin>>m[i][j];
  21.     }
  22.     for(i=0;i<b;i++){
  23.             for(j=0;j<a;j++)
  24.                 cout<<m[i][j];
  25.             cout<<endl;
  26.         }
  27.  
  28.  
  29.  
  30. delete[] m;
  31. system("pause");
  32. return 0;
  33. }
  34.  
  35.  
------------

Pero si lo quiero usar a traves de que la funcion lo imprima se me complica...

A esto es lo que llegue yo :

--------------------------------------------
Código: Text
  1.  
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. void escribemat(int* t,int nf,int nc);
  6.  
  7. int main(){
  8.  
  9.     int a, b,i,j;
  10.     a=b=0;
  11.     int **m;
  12.  
  13.     cout<<"Ingrese la cantidad de Filas seguido de la cantidad de columnas de la Matriz"<<endl;
  14.             cin>>a>>b;
  15.     m = new int *[a]; // array de A punteros a int
  16.     for(int i=0;i<a+1;i++)m[i]= new int[b]; // m es un array de [a]*[b]
  17.  
  18.     cout<<"Ingrese la matriz por filas"<<endl;
  19.     for(i=0;i<a;i++){
  20.         for(j=0;j<b;j++)
  21.             cin>>m[i][j];
  22.     }
  23.     /*for(i=0;i<b;i++){
  24.             for(j=0;j<a;j++)
  25.                 cout<<m[i][j];
  26.             cout<<endl;
  27.         }*/
  28.  
  29.  
  30.     escribemat(&m,a,b);
  31.  
  32. delete[] m;
  33. system("pause");
  34. return 0;
  35. }
  36.  
  37. void escribemat(int* t,int nf,int nc){
  38.     int i,j;
  39.  
  40.     for(i=0;i<nc;i++){
  41.         for(j=0;j<nf;j++)
  42.             cout<<* t[i][j];
  43.                 cout<<endl;
  44. }
  45. }
  46.  
  47.  
--------------------------

Pero me salen los siguientes errores:
1) Cannot convert 'int***' to 'int*' for argument to 'void escribemat(int*,int,int)'
2) Invalid types 'int[int]' for array subscript.


desde ya muchas gracias. y si alguien tiene un manual en donde salga bien explicado el uso de punteros con funciones se lo agradeceria muchisimo yo ya trate con unos 6 y ninguno me lo explica de forma que lo entienda....
Título: Re: Hola problema con la utilizacion de punteros+array+funciones
Publicado por: ProfesorX en Miércoles 27 de Enero de 2010, 03:29
Antes que nada, cuando publiques codigo, usa las etiquetas [ code][ /code] (sin espacios entre corchetes) para que tu codigo sea mas legible.

No es gran ciencia, tu variable m es de tipo int** (apuntador a apuntador de entero), por lo tanto asi lo debes declarar en la cabecera de tu funcion.

Código: C++
  1.  
  2. void escribemat(int **t,int nf,int nc)
  3.  
  4.  

y la llamada a tu funcion, escribela sin el &, puesto que m ya contiene una direccion al ser apuntador, por lo que no se necesita el &

Código: C++
  1.  
  2.     escribemat(m,a,b);
  3.  
  4.  

Pero revisando tu codigo, he notado que no liberas de manera correcta tus punteros, debes usar un ciclo adicional para eliminar, igual que usas un ciclo al principio para crear. Lee el siguiente enlace para que veas que te falta:

http://c.conclase.net/curso/index.php?cap=017

Saludos :)
Título: Re: Hola problema con la utilizacion de punteros+array+funciones
Publicado por: Garethsoul en Miércoles 27 de Enero de 2010, 04:14
Muchisimas gracias por responder tan bien, tan rápido y por el link.
No se me da muy bien todavía el uso de punteros con arrays je
Título: Re: Hola problema con la utilizacion de punteros+array+funciones
Publicado por: Garethsoul en Miércoles 27 de Enero de 2010, 20:02
Buenas de vuelta disculpen la molestia luego de que me explicaras como hacer con el otro puntero me di a la tarea de querer crear un programa que me leyera la matriz desde una funcion (osea le mandaba la matriz por referencia) y que luego en el main la pudiera imprimir...

Cual es el inconveniente... compila todo queda perfecto me lee la matriz pero cuando vuelvo al main y la quiero imprimir el programa se quiebra...
Código: C++
  1.  
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. //int sumarF(int** H,int f, int c);
  6. //void maxF();
  7. void leerM(int** M, int f,int c);
  8.  
  9. int main(){
  10.     int nf,nc,i,j,**s;
  11.  
  12.     cout<<"Ingrese el numero de filas y de columnas"<<endl;
  13.     cin>>nf>>nc;
  14.  
  15.     leerM(s, nf,nc);
  16.  
  17.     cout<<"La matriz es :"<<endl;
  18.     for(i=0;i<nf;i++){
  19.         for(j=0;j<nc;j++){
  20.                 cout<< s[i][j];
  21.                          }
  22.                 cout<<endl;
  23.             };
  24.     //cout<<"La suma de todos los numeros de la matriz da "<<sumarF(s,nf,nc)<<endl;
  25.  
  26.     for(i=0;i<nf;i++)
  27.         delete[] s[i];
  28.     delete[] s;
  29.  
  30. system("pause");
  31. return 0;
  32. }
  33. //funcion que lee la matriz y la devuelve al main o eso trata je
  34. /*int sumarF(int** H,int f, int c){
  35.     int i,j,S=0;
  36.     for(i=0;i<f;i++){
  37.         for(j=0;j<c;j++){
  38.             S += H[i][j];
  39.         }
  40.     }
  41.     return S;
  42. }
  43. */
  44. void leerM(int** M, int f, int c){
  45.     int i, j;
  46.     M = new int *[f];
  47.     for(i=0;i<f;i++) M[i] = new int [c];
  48.  
  49.     cout<<"Introdusca la matriz por filas "<<endl;
  50.     for(i=0;i<f;i++){
  51.         for(j=0;j<c;j++){
  52.             cin>> M[i][j];
  53.         }
  54.  
  55. }
  56. }
  57.  
  58.  
[/code]

desde ya disculpen la molestia.

si por lo menos me tirara un error me las apañaria solo pero :S sinceramente dentro de mi logica el programa TENDRIA que andar o no?
Título: Re: Hola problema con la utilizacion de punteros+array+funciones
Publicado por: Garethsoul en Miércoles 27 de Enero de 2010, 21:04
je me auto respondo :P pero lo dejo aca por si a alguien mas le hace falta.

la razon por la que no funcionaba era porque yo guardaba la memoria (usaba new) en la funcion y la tenia que usar en el main :)

tiene que quedar asi!


Código: C++
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. //int sumarF(int** H,int f, int c);
  5. //void maxF();
  6. void leerM(int** M, int f,int c);
  7.  
  8. int main(){
  9.     int nf,nc,i,j,**s;
  10.  
  11.  
  12.     cout<<"Ingrese el numero de filas y de columnas"<<endl;
  13.     cin>>nf>>nc;
  14.     s = new int *[nf];
  15.             for(i=0;i<nf;i++) s[i] = new int [nc];
  16.  
  17.     leerM(s, nf,nc);
  18.  
  19.     cout<<"La matriz es :"<<endl;
  20.     for(i=0;i<nf;i++){
  21.         for(j=0;j<nc;j++){
  22.                 cout<< s[i][j];
  23.                          }
  24.                 cout<<endl;
  25.             };
  26.     //cout<<"La suma de todos los numeros de la matriz da "<<sumarF(s,nf,nc)<<endl;
  27.  
  28.     for(i=0;i<nf;i++)
  29.         delete[] s[i];
  30.     delete[] s;
  31.  
  32. system("pause");
  33. return 0;
  34. }
  35. //funcion que lee la matriz y la devuelve al main o eso trata je
  36. /*int sumarF(int** H,int f, int c){
  37.     int i,j,S=0;
  38.     for(i=0;i<f;i++){
  39.         for(j=0;j<c;j++){
  40.             S += H[i][j];
  41.         }
  42.     }
  43.     return S;
  44. }
  45. */
  46. void leerM(int** M, int f, int c){
  47.     int i, j;
  48.  
  49.     cout<<"Introdusca la matriz por filas "<<endl;
  50.     for(i=0;i<f;i++){
  51.         for(j=0;j<c;j++){
  52.             cin>> M[i][j];
  53.         }
  54.  
  55. }
  56. }
  57.  
  58.