 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Enrique Master


Registrado: 13 Ago 2002Mensajes: 261Ubicación: La Vila Joiosa (Alacant)
|
Publicado: Vie 06 Dic, 2002 8:05 pm Asunto: Ampliar o reducir vectores dinámicos con función genérica |
|
|
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 |
|
 |
Enrique Master


Registrado: 13 Ago 2002Mensajes: 261Ubicación: La Vila Joiosa (Alacant)
|
Publicado: Sab 07 Dic, 2002 6:54 am Asunto: |
|
|
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 |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|