Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Ampliar o reducir vectores dinámicos con función genérica

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Ampliar o reducir vectores dinámicos con función genérica Responder citando

Hola, estoy trabajando en un programa que usa un gran número de vectores y matrices dinámicos. Ante ciertos eventos tengo que cambiar sus dimensiones para lo que uso el código
Código:
void __fastcall TFPrincipal::AmpliaMemoriaVertices(void)
  {
  V = new TVertice[Grafo.Vertices - 1]; //Crea el vector para copiar vértices
  for (int i = 0; i < Grafo.Vertices - 1; i++)           //Copia los vértices
    V[i] = Vertice[i];
  delete[] Vertice;

  CapacidadVertices += IncrementoCapacidadVertices;
  Vertice = new TVertice[CapacidadVertices];   //Recrea el vector de vértices
  for (int i = 0; i < Grafo.Vertices - 1; i++)        //Recupera los vértices
    Vertice[i] = V[i];
  delete[] V;                                             //Destruye la copia
  }
//---------------------------------------------------------------------------


cuando quiero ampliar sus dimensiones y otro similar cuando quiero reducirla. Como podéis observar el código está dedicado a un vector en concreto, y mi pregunta va en este sentido.

Como necesito hacer esto en bastantes ocasiones y con un buen número de vectores (matrices) distintos ¿ de qué modo he de hacerlo para reducir todas las funciones a una sola ? (estoy harto de declarar nuevas funciones cada vez que incluyo un vector nuevo al programa, y aún me quedan unos cuantos por incluir).

Por supuesto la solución pasa por enviar como parámetros el puntero al vector, el número de filas, el valor por defecto de los nuevos elementos, ... El problema lo tengo al enviar el puntero al vector ¿ de qué modo he de hacerlo ? He intentado usar el siguiente código:
Código:

void bAmpliaVector(bool *origen, const short int filasAntes,
                   const short int filasDespues, bool valor)
  {
  bool *v;
  v = new bool[filasAntes];
  for (int i = 0; i < filasAntes; i++)
    v[i] = origen[i];
  delete[] origen;
  origen = new bool[filasDespues];
  for (int i = 0; i < filasAntes; i++)
    origen[i] = v[i];
  for (int i = filasAntes; i < filasDespues; i++)
    origen[i] = valor;
  delete[] v;
  }
//---------------------------------------------------------------------------


Lo he intentado de distintos modos y no lo consigo, al usarlo por segunda vez me salta el CodeGuard y me dice que lo hago mal, que el vector origen ya está borrado, pero no consigo entender por qué ni dónde.

Espero haberme explicado. En la cabeza tengo muchas más cosas y es altamente probable que se me olvide algo, pero creo que la idea se entiende.

Gracias.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Hola, parece que me ha sentado bien despejarme y enfrentarme al manejo directo de memoria (con suma prudencia, por supuesto). Ya tenía en mente usar realloc() pero no me atrevía por si era muy complejo el uso simultáneo de malloc() y free(). No ha sido así, la cosa es bastante sencilla (con la inestimable ayuda de sizeof()). Con el uso de realloc() ya no necesito crear tanta copia y tanto lío, tampoco necesito usar continuamente delete[] y new. Bueno, una maravilla, lástima no haberlo intentado antes.

Saludos a todos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.