Duda con una cosa rarísima (tema punteros)

Iniciado por SARGE553413, 15 Abril 2013, 18:50 PM

0 Miembros y 1 Visitante están viendo este tema.

SARGE553413

Hola a todos.

Tengo un problema, no se por qué al reservar espacio para una matriz dinámica se me de-reserva el espacio de un vector dinámico previamente reservado:

Muestro el código.



class Graph{
      private:
              int *nodes;
              int **nears;
              int *nNears;
              int nNodes;
....
};

inline void Graph::addArist(int o,int d){
    int n=this->search(o);
    if(n!=-1){
        if(this->nNears[n-1]==0){
            int aux=this->nodes[n-1];
            this->nears[n-1]=(int *)calloc(1,sizeof(int));

            //tras ejecutar esta instrucción, la componente n-1 de 'nodes' deja de //tener su valor original para tener números raros, y si intento reasignarle el valor //a nodes[n-1] el programa falla. No lo entiendo

            (this->nears[n-1])[0]=d;
        }else{
            int *aux=(int *)realloc(this->nears[n-1],(this->nNears[n-1]+1)*sizeof(int));
            this->nears[n-1]=aux;
           
            (this->nears[n-1])[this->nNears[n-1]]=d;
            this->nNears[n-1]++;
        }
    }
}



PD. Lo hago con calloc en lugar de new para poder usar realloc.

Muchas gracias

leosansan

Cita de: SARGE553413 en 15 Abril 2013, 18:50 PM
Hola a todos.

...............................................

PD. Lo hago con calloc en lugar de new para poder usar realloc.


No sé bien por qué te complicas la vida con calloc y realloc si la ventaja de trabajar con new es que usas el heap, más o menos la memoria del ordenador y puedes dimensionar a valores de 1 000 000 o más altos. Es aprovechar la ventaja de trabajar en C++.

Saluditos!. ....

amchacon

Tienes la clase vector:
http://www.cplusplus.com/reference/vector/vector/

Ejemplo de funcionamiento:

Código (cpp) [Seleccionar]
#include <vector>

//...

vector<int> Cosita; // Crea un vector de enteros;

Cosita.push_back(1); // Añade un 1 al vector

Cosita.push_back(2); // Añade un 2 al vector

Cosita.push_back(4); // Añade un 4 al vector

for (int i = 0; i < Cosita.size();i++) // Recorremos el vector
  cout<<"El valor es "<<Cosita[i]<<endl;
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

SARGE553413

#3
Gracias por las respuestas.

El motivo por el cual no he usado new es porque, hasta donde yo se, si tienes un vector de 20 enteros por ej, construido con new, si quieres redimensionarlo a 25 tienes que hacer uno nuevo de 25 y copiarle los valores antiguos, y pensaba que poder hacerlo con realloc sería mas eficiente.

De todas formas creo que usaré la librería vector mejor, aunque no se aún muy bien como va, pero bueno ya la iré aprendiendo.

Saludos.

leosansan

Cita de: SARGE553413 en 15 Abril 2013, 23:11 PM
Gracias por las respuestas.

El motivo por el cual no he usado new es porque, hasta donde yo se, si tienes un vector de 20 enteros por ej, construido con new, si quieres redimensionarlo a 25 tienes que hacer uno nuevo de 25 y copiarle los valores antiguos, y pensaba que poder hacerlo con realloc sería mas eficiente.


Me repito, la ventaja de new es que puedes sobredimensionar por si te quedas corto, si te hacen falta 25 dimensionas a 250 o 2500, no problem. No es como en C donde la memoria es un bien escaso que hay que mirar con lupa.

Saluditos!....

amchacon

Cita de: leosansan en 16 Abril 2013, 00:30 AM
Me repito, la ventaja de new es que puedes sobredimensionar por si te quedas corto, si te hacen falta 25 dimensionas a 250 o 2500, no problem. No es como en C donde la memoria es un bien escaso que hay que mirar con lupa.

Saluditos!....

Eh? Cada llamada a new reserva nueva memoria. No hay redimensionamiento alguno.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar