[C con Clase] Array dinámico en C++ estándar
Steven Davidson
srd4121 en njit.edu
Mar Mayo 1 21:47:59 CEST 2012
Hola User,
On 5/1/2012 2:21 PM, User wrote:
> Hola de nuevo,
>
> He realizado este pequeño programa para probar la alternativa que no
> usa clases plantillas:
>
> #include <iostream>
> #include <stdio.h>
> #include <stdlib.h>
Deberías acostumbrarte a los nombres correctos de estos ficheros
estándares de cabecera de C++:
#include <cstdio>
#include <cstdlib>
Aunque creo que no necesitas <cstdio>.
> #include <fstream>
>
> using namespace std;
>
> int main()
> {
[CORTE]
Recuerda que debes liberar la memoria previamente adjudicada por
'realloc()'. Escribe:
free( pDoubles );
> return 0;
> }
>
> Imaginemos ahora que necesito que el array de doubles sea
> bidimensional, es decir, sabemos que va a tener dos columnas, pero un
> número indeterminado de filas.
>
> ¿Cómo podría implementarlo?
>
Si sabes que van a ser dos números por elemento, entonces tienes dos
posibles soluciones:
1. Crea un array de 'double' con el doble de la cantidad de elementos
que necesitas. Por ejemplo,
double *pDoubles = NULL;
int nCant = 0;
pDoubles = (double *) realloc( pDoubles, ++nCant * 2 * sizeof(double) );
...
Y luego, para acceder a un elemento, doblamos el índice:
pDoubles[2*5] = -1.023;
pDoubles[2*5+1] = 6.7031;
Se trata del 6º elemento - de índice 5, pero realmente se trata de los
elementos de índices 10 y 11 en nuestro array.
2. Crea un array de un array de 'double'. Esto es,
typedef double coordenada[2];
...
coordenada *pDoubles = NULL;
int nCant = 0;
pDoubles = (coordenada *) realloc( pDoubles, ++nCant * sizeof(coordenada) );
...
Para acceder a un elemento, usamos el índice para 'pDoubles' y otro para
la "columna":
pDoubles[5][0] = -1.023;
pDoubles[5][1] = 6.7031;
Como puedes ver, creamos un tipo que realmente es un array de 2
'double', para usarlo en el array dinámico de 'coordenada'.
Si quieres, puedes crear un array dinámico de arrays dinámicos de
'double'. Por ejemplo,
double **pDoubles = NULL;
int nCant = 0;
pDoubles = (double **) realloc( pDoubles, ++nCant * sizeof(double *) );
pDoubles[i] = (double *) realloc( pDoubles, 2 * sizeof(double) );
pDoubles = (double **) realloc( pDoubles, ++nCant * sizeof(double *) );
pDoubles[i] = (double *) realloc( pDoubles, 2 * sizeof(double) );
...
El acceso a un elemento es el de un array bidimensional:
pDoubles[5][0] = -1.023;
pDoubles[5][1] = 6.7031;
Espero que esto te oriente.
Steven
Más información sobre la lista de distribución Cconclase