• Sábado 27 de Abril de 2024, 23:30

Autor Tema:  declaracion y uso de matrices dinamicas en c++  (Leído 4887 veces)

mabama

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
declaracion y uso de matrices dinamicas en c++
« en: Lunes 11 de Mayo de 2009, 01:44 »
0
Soy novato en c++ y no sé como declarar matrices dinamicas y como utilizarlas.
He visto en otros temas como hacerlo, pero con la funcion de malloc de c, yo prefiero no hacerlo asi.
Mi idea de hacerlo, es como si fuera un array simple...pero como es normal, no me funciona
¿como podría hacerlo?
un array simple, lo estoy haciendo del estilo
main (){
int array[elementos];
funcion (array);
}
y la cabecera de funcion
void funcion (int *array)

la matriz comence a hacerla (claramente esta mal)
main(){
int matriz[a];
funcion(matriz);
}
void funcion(int **array){
matriz[1][1]=0;      //Esto no esta nada bien
}
¿cómo podria hacerlo?
Me hago un lio con los punteros. me podría recomendar un buen manual?
Gracias
Un saludo

fachamix

  • Miembro MUY activo
  • ***
  • Mensajes: 173
  • Nacionalidad: ar
    • Ver Perfil
Re: declaracion y uso de matrices dinamicas en c++
« Respuesta #1 en: Lunes 11 de Mayo de 2009, 02:17 »
0
pone en google


C con clase
La muerte vive celosa, de mi amada flor la vida. Dicen que me anda buscando, ojala si un dia me pilla. Me alle MACHAO Y CANTANDO PA QUE SE MUERA DE ENVIDIA

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: declaracion y uso de matrices dinamicas en c++
« Respuesta #2 en: Lunes 11 de Mayo de 2009, 09:48 »
0
Cita de: "mabama"
He visto en otros temas como hacerlo, pero con la funcion de malloc de c, yo prefiero no hacerlo asi.
No se trata de preferir o no, se trata de que sólo se puede hacer así si quieres memoria dinámica. Lo de int matriz[a]; es lo que está mal, no se puede definir el tamaño de un vector con variables porque se debe reservar el espacio en compilación. Si lo que quieres es que la matriz pueda tener diferentes tamaños, sólo te queda usar memoria dinámica, que por cierto, tratándose de C++, mejor clases y new/delete, y no malloc()/free().

Saludos

mabama

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Re: declaracion y uso de matrices dinamicas en c++
« Respuesta #3 en: Lunes 11 de Mayo de 2009, 13:36 »
0
De acuerdo. Lo haré con clases.
Muchas gracias.
Un saludo

mabama

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Re: declaracion y uso de matrices dinamicas en c++
« Respuesta #4 en: Lunes 11 de Mayo de 2009, 14:44 »
0
Otra duda que tengo, ¿qué diferencia tendría entre usar caso1 y caso2?
caso1:
main {
    while () {
        bool A
  • ;


   }
}

mabama

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Re: declaracion y uso de matrices dinamicas en c++
« Respuesta #5 en: Lunes 11 de Mayo de 2009, 14:49 »
0
Otra duda que tengo, ¿qué diferencia tendría entre usar caso1 y caso2? ¿Y qué caso sería más recomendable utilizar? Contando que A varía varias veces
caso1:
main {
    while () {
        bool A
  • ;

        llamada (A);
   }
}
void llamada(bool *A){
       A[1]=false;
}

caso2:
main {
bool *A;
    while () {
        A=new bool
  • ;

        llamada (&A);
        delete *A;
   }
}
void llamada(bool **A){
       (*A[1])=false;
}

Supongo que los punteros se utilizarían así, es que me sigo perdiendo.
GRACIAS de nuevo

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: declaracion y uso de matrices dinamicas en c++
« Respuesta #6 en: Lunes 11 de Mayo de 2009, 16:24 »
0
Usa las etiquetas de código para entendernos mejor:

caso1:
Código: C++
  1. main
  2. {
  3.     while ()
  4.     {
  5.         bool A[x];
  6.         llamada (A);
  7.     }
  8. }
  9.  
  10. void llamada(bool *A)
  11. {
  12.     A[1]=false;
  13. }
  14.  
caso2:

Código: C++
  1. main
  2. {
  3.     bool *A;
  4.     while ()
  5.     {
  6.         A=new bool [x];
  7.         llamada (&A);
  8.         delete *A;
  9.     }
  10. }
  11. void llamada(bool **A)
  12. {
  13.     (*A[1])=false;
  14. }
  15.  
Bueno, no necesitas para nada un puntero a puntero. Y en ambos casos tienes un tamaño fijo. Resumiendo, no puedes utilizar vectores con memoria dinámica, porque son estructuras fijas. Puedes usar una lista enlazada sencilla:

Código: C++
  1. class cNodoBool
  2. {
  3.     private:
  4.         bool valor;
  5.         cNodoBool *sig;
  6.     public:
  7.         cNodoBool();
  8.         ~cNodoBool();
  9.         bool obtener_valor();
  10.         void poner_valor(bool valor);
  11.         cNodoBool *obtener_sig();
  12.         void poner_sig(cNodoBool *sig);
  13. };
  14.  
  15. class cListaBool
  16. {
  17.     private:
  18.         cNodoBool *cabecera;
  19.     public:
  20.         cListaBool();
  21.         ~cListaBool();
  22.         bool mirar_elemento(int posicion);
  23.         void insertar_elemento(bool valor);
  24.         bool sacar_elemento();
  25. };
  26.  
¿Se te ocurre cómo rellenar los métodos para implementar esta estructura de datos?  :hitcomp:

mabama

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Re: declaracion y uso de matrices dinamicas en c++
« Respuesta #7 en: Lunes 11 de Mayo de 2009, 17:08 »
0
De acuerdo. Si sabría como rellenar los métodos.
Pero pensé que podría hacerlo de la manera que comentaba, puesto que x va variando.
Perdón, por no utilizar las etiquetas de código.
GRACIAS
Un saludo

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: declaracion y uso de matrices dinamicas en c++
« Respuesta #8 en: Lunes 11 de Mayo de 2009, 17:23 »
0
Cita de: "mabama"
puesto que x va variando.
Como ya te he dicho, un vector es una estructura estática que se define en tiempo de compilación, por tanto no puedes asignarle variables al tamaño, ya que el compilador no sabría qué valor tiene antes de ejecutar el programa.

fachamix

  • Miembro MUY activo
  • ***
  • Mensajes: 173
  • Nacionalidad: ar
    • Ver Perfil
Re: declaracion y uso de matrices dinamicas en c++
« Respuesta #9 en: Lunes 11 de Mayo de 2009, 17:33 »
0
Cita de: "m0skit0"
Cita de: "mabama"
He visto en otros temas como hacerlo, pero con la funcion de malloc de c, yo prefiero no hacerlo asi.
No se trata de preferir o no, se trata de que sólo se puede hacer así si quieres memoria dinámica. Lo de int matriz[a]; es lo que está mal, no se puede definir el tamaño de un vector con variables porque se debe reservar el espacio en compilación. Si lo que quieres es que la matriz pueda tener diferentes tamaños, sólo te queda usar memoria dinámica, que por cierto, tratándose de C++, mejor clases y new/delete, y no malloc()/free().

Saludos

moskio tiene razon, SE DEBE USAR SI O SI malloc, new, etc, peroi siempre terminas haciendo lo mismo, MEMORI DINAMICA DEL HEAP.

otra cosa moskito, si se puede hacer por ejemplo:
vector[variable]
es codeblocks con MINGW, yo lo hice, mira este post donde posteo el codigo de los subconjuntos:
viewtopic.php?f=18&t=39235

Código: C++
  1.  
  2.  
  3. #include <iostream>
  4.  
  5. using namespace std;
  6.  
  7. /*
  8. variable N, es la cantidad de elementos del conjunto padre
  9. variable M, es la cantidad de elementos que deben tener los cubconjuntos generados de PADRE
  10. */
  11. int N,M;
  12.  
  13. void imprimir_memoria(int memoria[100][10]); //imprime los subconjuntos generados
  14.  
  15. /* funcion que devuelve true si ya se evaluaron todos los elementos del conjunto PADRE*/
  16. bool fin_vectorPunteros(int vectorPunteros[]);
  17.  
  18. /*funcion que nos dice si el vector punteros apunta elementos distintos, es necesario, porque no podemos generar un subconjunto de 3 elementos que sea {1,1,2} por ejemplo */
  19. bool apunta_elementos_distintos(int vectorPadre[],int vectorPunteros[]);
  20.  
  21. /*funcion para incrementar el vector de punteros y apuntar al elemento siguiente del conjunto PADRE*/
  22. void inc_vectorPunteros(int vectorPunteros[],int longitud);
  23.  
  24. /*cuando se encuentra un subconjunto , debo guardarlo, en este caso en una memoria de 100 x 10, es decir podre almacenar hasta 100 subconjuntos de como maximo 10 elementos c/u*/
  25. void guardar_subconjunto_en_memoria(int memoria[100][10],int vectorPunteros[],int vectorPadre[]);
  26.  
  27. /*cuando el vector punteros se actualiza, hay un posible subconjunto de PADRE (apuntado por este vector), por ese debemos averiguar si existe un subconjunto en memoria igualal encontrado, pues puede darse el caso de haber almacenado el subconjunto {1,2} y en algun momento del algoritmo hacer referencia a un subconjunto {2,1} que seria equivalente*/
  28. bool subconjunto_encontrado_en_memoria(int memoria[100][10],int vectorPadre[],int vectorPunteros[]);
  29.  
  30. /*imprime el contenido de vectorPunteros*/
  31. void imprimir_vectorPunteros(int vectorPunteros[]);
  32.  
  33. /*imprime los elementos (que formarian un posible subconjunto) de PADRE apuntados por vectorPunteros*/
  34. void imprimir_vectorPadreApuntado(int vectorPadre[],int vectorPunteros[]);
  35.  
  36.  
  37. int main()
  38. {
  39.     cout << "Programa que genera SubConjuntos" << endl;
  40.     /*digo cuantos elementos tendra PADRE*/
  41.     cout << "Ingrese el numero de elementos del conjunto PADRE:";
  42.     cin >> N; cout << endl;
  43.    
  44.     /*luego cargo el conjunto PADRE*/
  45.     cout << "Cargue los elementos del conjunto PADRE:" << endl;
  46.     int vectorPadre[N];
  47.     for (int i = 0;i<N;i++) {
  48.         cout << i << ">";
  49.         cin >> vectorPadre[i];
  50.         cout << endl;
  51.     }
  52.     /*imprimo su contenido para verificar*/
  53.     cout << "Imprimiendo conjunto PADRE:" << endl;
  54.     for (int i = 0; i<N ;i++) {
  55.         cout << vectorPadre[i] << "-";
  56.     }
  57.  
  58.     cout << endl << "----------------------------------------------" << endl;
  59.     /* digo cuantos elementos debera tener los subconjuntos generados */
  60.     cout << endl << "Ingrese el tamaño de los subconjuntos:";
  61.     cin >> M;
  62.  
  63.     cout << endl << "----------------------------------------------" << endl;
  64.  
  65.     /* inicio el vector punteros en 0 para asegurar su contenido */
  66.     cout << "iniciando vector punteros en 0" << endl;
  67.     int vectorPunteros[M];
  68.     for (int i = 0;i<M;i++){
  69.         vectorPunteros[i] = 0;
  70.     }
  71.  
  72.     cout << endl << "----------------------------------------------" << endl;
  73.  
  74.     /* genero e inicio una memeoria para almacenar los subconjuntos encontrados */
  75.     cout << "iniciando matriz de memoria en -1" << endl;
  76.     int memoria[100][10];
  77.     for (int i = 0;i<100;i++) {
  78.         for (int j = 0;j<M;j++){
  79.             memoria[i][j] = -1;
  80.         }
  81.     }
  82.    
  83.     /* Parte principal del programa */
  84.     while (!fin_vectorPunteros(vectorPunteros)){
  85.         if (apunta_elementos_distintos(vectorPadre,vectorPunteros)) {
  86.             if (!subconjunto_encontrado_en_memoria(memoria,vectorPadre,vectorPunteros)){
  87.                 cout << "Subconjunto nuevo {" << endl;
  88.                 cout << "t"; imprimir_vectorPunteros(vectorPunteros);
  89.                 cout << "t"; imprimir_vectorPadreApuntado(vectorPadre,vectorPunteros);
  90.                 cout << endl << "}" << endl;
  91.  
  92.                 guardar_subconjunto_en_memoria(memoria,vectorPunteros,vectorPadre);
  93.             }
  94.         }
  95.         inc_vectorPunteros(vectorPunteros,M);
  96.     }
  97.     system("pause");
  98.     imprimir_memoria(memoria);
  99.     return 0;
  100. }
  101.  
  102. bool subconjunto_encontrado_en_memoria(int memoria[100][10],int vectorPadre[],int vectorPunteros[]){
  103.     bool ban = false,temp;
  104.     int fila = 0,coincidencias;
  105.  
  106.     while (memoria[fila][0] != -1) {
  107.         coincidencias = 0;
  108.         for (int j = 0;j<M;j++){
  109.             for (int j2 = 0;j2<M;j2++){
  110.                 if (memoria[fila][j] == vectorPadre[vectorPunteros[j2]]) {
  111.                     coincidencias++;
  112.                 }
  113.             }
  114.         }
  115.         fila++;
  116.         if (coincidencias == M) {
  117.             return true;
  118.         }
  119.     }
  120.     return false;
  121. }
  122.  
  123. void guardar_subconjunto_en_memoria(int memoria[100][10],int vectorPunteros[],int vectorPadre[]) {
  124.     int fila;
  125.     for (fila = 0;((fila<100) && (memoria[fila][0] != -1));fila++);
  126.     for (int j = 0;j<M;j++){
  127.         memoria[fila][j] = vectorPadre[vectorPunteros[j]];
  128.     }
  129. }
  130.  
  131. void inc_vectorPunteros(int vectorPunteros[],int longitud) {
  132.     bool ban = true;
  133.     longitud--;
  134.     while (ban) {
  135.         if (vectorPunteros[longitud] == (N-1)) {
  136.             vectorPunteros[longitud] = 0;
  137.             longitud--;
  138.         }
  139.         else {
  140.             vectorPunteros[longitud] = vectorPunteros[longitud] + 1;
  141.             ban = false;
  142.         }
  143.     }
  144. }
  145.  
  146. bool apunta_elementos_distintos(int vectorPadre[],int vectorPunteros[]) {
  147.     for (int i = 0;i<M;i++){
  148.         for (int j = i+1;j<M;j++) {
  149.             if (vectorPadre[vectorPunteros[i]] == vectorPadre[vectorPunteros[j]]) {
  150.                     return false;
  151.             }
  152.         }
  153.     }
  154.  
  155.     return true;
  156. }
  157.  
  158. bool fin_vectorPunteros(int vectorPunteros[]) {
  159.     bool ban = true;
  160.     for (int i = 0;i<M;i++) {
  161.         if (vectorPunteros[i] != (N-1)) {
  162.             ban = false;
  163.         }
  164.     }
  165.     return ban;
  166. }
  167.  
  168. void imprimir_memoria(int memoria[100][10]) {
  169.     for (int i = 0;i<100;i++){
  170.         for (int j = 0;j<M;j++){
  171.             cout << memoria[i][j] << " ";
  172.         }
  173.         cout << endl;
  174.     }
  175. }
  176.  
  177. void imprimir_vectorPunteros(int vectorPunteros[]){
  178.     cout << " Vector Punteros: ";
  179.     for (int i = 0; i<M ; i++){
  180.         cout << vectorPunteros[i];
  181.     }
  182. }
  183.  
  184. void imprimir_vectorPadreApuntado(int vectorPadre[],int vectorPunteros[]){
  185.     cout << " Vector Padre Apuntado: ";
  186.     for (int i = 0; i<M ; i++){
  187.         cout << vectorPadre[vectorPunteros[i]];
  188.     }
  189. }
  190.  
  191.  

compila perfecto y funciona mejor, en serio probalo. estoy seguro que el compilador lo permite pero termina manejando estructura dinamica luego por su cuenta para resolver tal linea de codigo, pero lo permite.
La muerte vive celosa, de mi amada flor la vida. Dicen que me anda buscando, ojala si un dia me pilla. Me alle MACHAO Y CANTANDO PA QUE SE MUERA DE ENVIDIA

Luciano9

  • Miembro activo
  • **
  • Mensajes: 25
    • Ver Perfil
Re: declaracion y uso de matrices dinamicas en c++
« Respuesta #10 en: Lunes 11 de Mayo de 2009, 17:35 »
0
Muy útil este thread para mi, gracias :D

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: declaracion y uso de matrices dinamicas en c++
« Respuesta #11 en: Lunes 11 de Mayo de 2009, 18:11 »
0
Gracias, fachamix  :good:

fachamix

  • Miembro MUY activo
  • ***
  • Mensajes: 173
  • Nacionalidad: ar
    • Ver Perfil
Re: declaracion y uso de matrices dinamicas en c++
« Respuesta #12 en: Martes 12 de Mayo de 2009, 08:41 »
0
de nada hermano
La muerte vive celosa, de mi amada flor la vida. Dicen que me anda buscando, ojala si un dia me pilla. Me alle MACHAO Y CANTANDO PA QUE SE MUERA DE ENVIDIA