Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Omar_2013 en 2 Septiembre 2013, 22:36 pm



Título: Asignar Mas Memoria A Un Arreglo Dinamico
Publicado por: Omar_2013 en 2 Septiembre 2013, 22:36 pm
En el main tengo un arreglo de tamaño 1 pero necesito que este incremente su tamaño a medida que el usuario digite mas y mas datos...

Código:
#include <cstdlib>
#include <iostream>
#include <string>
#include <conio.h>

using namespace std;

struct Datos {
       string Nombre;
       int Edad;
};

struct Categorias {
       string Deporte;
       int Atletas;
       Datos Informacion;
};

void Ingresar_Deportista ( Categorias *Deportes, int Cant_Deportes );

int main(int argc, char *argv[])
{   
    int Num_Deportes=1; //Tamaño Variable - Cambia En Tiempo De Ejecucion
    Categorias *Deportes= new Categorias[Num_Deportes];

    Ingresar_Deportista( Deportes, Num_Deportes );
   
    system("PAUSE");
    return EXIT_SUCCESS;
}

Ese incremento de tamaño lo implemente en la funcion Ingresar_Deportista justo al final

Código:
void Ingresar_Deportista ( Categorias *Deportes, int Cant_Deportes ){
     
     int i=0, Aux=0;
     char Opcion='s';
     
     while(Opcion=='s'){
     cout<<"Deporte: ";
     cin>>Deportes[i].Deporte;
     cout<<"\nNombre: ";
     cin>>Deportes[i].Informacion.Nombre;
     cout<<"Edad: ";
     cin>>Deportes[i].Informacion.Edad;
     cout<<"\nIngresar Mas? Si(s) ";
     Opcion=getch();
     i+=1;
     system("cls");
     
//Si Supera El Tamaño Maximo (Darle Mas Memoria Al Arreglo Dinamico)

     if( i>=Cant_Deportes ){
         Categorias *Agrandar= new Categorias[Cant_Deportes+1];
         for(Aux=0; Aux<Cant_Deportes; Aux++)
         Agrandar[Aux]=Deportes[Aux];
         Deportes=Agrandar;}
     }
}

El codigo compila pero despues de ingresar el tercer deporte el ejecutable se totea, a que se debe esto?


Título: Re: Asignar Mas Memoria A Un Arreglo Dinamico
Publicado por: eferion en 2 Septiembre 2013, 22:59 pm
Esto se hace con vectores.

Código
  1. #include <vector>
  2.  
  3. void Ingresar_Deportista ( vector< Categorias >& Deportes );
  4.  
  5. int main(int argc, char *argv[])
  6. {  
  7.    int Num_Deportes=1; //Tamaño Variable - Cambia En Tiempo De Ejecucion
  8.    vector< Categorias > Deportes;
  9.  
  10.    Ingresar_Deportista( Deportes );
  11.  
  12.    system("PAUSE");
  13.    return EXIT_SUCCESS;
  14. }
  15.  
  16. void Ingresar_Deportista ( vector< Categorias >& Deportes )
  17. {
  18.     int i=0, Aux=0;
  19.     char Opcion='s';
  20.  
  21.     while(Opcion=='s'){
  22.       Categorias categoria;
  23.  
  24.     cout<<"Deporte: ";
  25.     cin>>categoria.Deporte;
  26.     cout<<"\nNombre: ";
  27.     cin>>categoria.Informacion.Nombre;
  28.     cout<<"Edad: ";
  29.     cin>>categoria.Informacion.Edad;
  30.  
  31.     Deportes.push_back( categoria );
  32.  
  33.     cout<<"\nIngresar Mas? Si(s) ";
  34.     Opcion=getch();
  35.     i+=1;
  36.     system("cls");
  37.  
  38.     }
  39. }

c++ tiene muchas clases útiles, es bastante importante conocer al menos las más importantes y, los contenedores ( vector, set, map, etc. ) son básicas.

Entre otras cosas gestionar tu esa memoria implica varios problemas. Por ejemplo para el que te ocupaba lo que tenías que hacer era crear un array nuevo, copiar el contenido del vector viejo en el nuevo, hacer que el puntero del vector viejo apuntase al nuevo y, finalmente, eliminar el vector viejo... demasiado curro innecesario.


Título: Re: Asignar Mas Memoria A Un Arreglo Dinamico
Publicado por: Omar_2013 en 2 Septiembre 2013, 23:15 pm
soy un novato ... por eso necesitaba saber como se hacia de la forma innecesaria ...por que la verdad no te entendi eso de las clases...


Título: Re: Asignar Mas Memoria A Un Arreglo Dinamico
Publicado por: eferion en 2 Septiembre 2013, 23:21 pm
El código siguiente crea un objeto llamado "Deportes" que va a ser un contenedor de tipo "vector", dicho contenedor va a almacenar elementos de tipo "Categorias".

Código
  1. vector< Categorias > Deportes;

Los contenedores son objetos de c++, como la clase string que ya has usado. Tienen su propio conjunto de métodos y sirven para almacenar colecciones de elementos, en tu caso un array de Categorias.

"vector" es un contenedor que se caracteriza porque los elementos que contiene mantienen el orden en el que fueron insertados, es decir, no ordena los objetos que contiene ( eso lo hace otro contenedor llamado "set" ).

El método "push_back" del vector añade un elemento al vector colocándolo al final de la lista.

La forma de acceder a los elementos de "vector" es la misma que para un array clásico de c, es decir, usando los corchetes. Esto es posible porque "vector" sobrecarga el operador de índice ( esto ya lo aprenderás en el futuro ).

Mejor así?


Título: Re: Asignar Mas Memoria A Un Arreglo Dinamico
Publicado por: Omar_2013 en 2 Septiembre 2013, 23:26 pm
 :huh:  de todas maneras gracias.  :huh: