Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: SARGE553413 en 15 Abril 2013, 18:50 pm



Título: Duda con una cosa rarísima (tema punteros)
Publicado por: SARGE553413 en 15 Abril 2013, 18:50 pm
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.

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


Título: Re: Duda con una cosa rarísima (tema punteros)
Publicado por: leosansan en 15 Abril 2013, 19:36 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!. ....
(http://i1280.photobucket.com/albums/a497/leosansan/leosan1/emoticonos105_zpsffe8236a.gif)


Título: Re: Duda con una cosa rarísima (tema punteros)
Publicado por: amchacon en 15 Abril 2013, 20:14 pm
Tienes la clase vector:
http://www.cplusplus.com/reference/vector/vector/

Ejemplo de funcionamiento:

Código
  1. #include <vector>
  2.  
  3. //...
  4.  
  5. vector<int> Cosita; // Crea un vector de enteros;
  6.  
  7. Cosita.push_back(1); // Añade un 1 al vector
  8.  
  9. Cosita.push_back(2); // Añade un 2 al vector
  10.  
  11. Cosita.push_back(4); // Añade un 4 al vector
  12.  
  13. for (int i = 0; i < Cosita.size();i++) // Recorremos el vector
  14.   cout<<"El valor es "<<Cosita[i]<<endl;


Título: Re: Duda con una cosa rarísima (tema punteros)
Publicado por: 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.

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.


Título: Re: Duda con una cosa rarísima (tema punteros)
Publicado por: leosansan en 16 Abril 2013, 00:30 am
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!....
(http://smilies-gifs.com/hola-adios/2hola-adios.gif)


Título: Re: Duda con una cosa rarísima (tema punteros)
Publicado por: amchacon en 16 Abril 2013, 01:04 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!....
(http://smilies-gifs.com/hola-adios/2hola-adios.gif)
Eh? Cada llamada a new reserva nueva memoria. No hay redimensionamiento alguno.