Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: BlackZeroX en 12 Febrero 2011, 10:27 am



Título: [Ayuda] Problema un poco sonso al intercambiar un puntero por otro.
Publicado por: BlackZeroX en 12 Febrero 2011, 10:27 am
.
mi problema es que en TEORIA mi funcion setnewptr deberia de asignar y/o devolver en el parametro old el puntero a New, pero solo lo afecta dentro de la funcion mas cuando termina no me afecta a c_pstr... ¿Como puedo solucionar esto?...

Aquí lo que digo...

Código
  1.  
  2. #include<iostream>
  3. #include<cstdlib>
  4. #include<cstring>
  5.  
  6. using namespace std;
  7.  
  8. void* setnewptr( void *old , void *New);
  9.  
  10. int main() {
  11.    char *c_pstr = NULL;
  12.    char *c_str = (char*)malloc(sizeof(char)*10);
  13.    strcpy(c_str , (const char*)"Hola");
  14.    cout << (char*)setnewptr( c_pstr , c_str );
  15.    cout << c_pstr << endl;
  16.    return 0;
  17. }
  18.  
  19. void* setnewptr( void *old , void *New)
  20. /**
  21.     Libera a [*old] si apunta a algo y le establece [*New];
  22.     By BlackZeroX ( http://Infrangelux.sytes.net/ )
  23. **/
  24. {
  25.    if ( old != NULL )
  26.        free (old);
  27.    return old=New;
  28. }
  29.  
  30.  


Título: Re: [Ayuda] Problema un poco sonso al intercambiar un puntero por otro.
Publicado por: diskontrol en 12 Febrero 2011, 12:56 pm
Buenas,

para reservar y liberar memoria en c++ tienes new y delete.

No se modifica fuera de la función porque new y old son copias, lo que estas pasando por referencia son las direcciones a la memoria reservada para la cadena, no a los punteros que es lo que tu intentas modificar en la función, como puedes comprobar si modificas así el programa:

 
Código
  1. #include<iostream>
  2. #include<cstdlib>
  3. #include<cstring>
  4.  
  5. using namespace std;
  6.  
  7. void* setnewptr( void *old , void *New);
  8.  
  9. int main() {
  10.    char *c_pstr = NULL;
  11.    char *c_str = (char*)malloc(sizeof(char)*10);
  12.    strcpy(c_str , (const char*)"Hola");
  13.    cout << (char*)setnewptr( c_pstr , c_str );
  14.    c_pstr=(char *)setnewptr(c_pstr,c_str);
  15.    cout << c_pstr << endl;
  16.    return 0;
  17. }
  18.  
  19. void* setnewptr( void *old , void *New)
  20. /**
  21.     Libera a [*old] si apunta a algo y le establece [*New];
  22.     By BlackZeroX ( http://Infrangelux.sytes.net/ )
  23. **/
  24. {
  25.    if ( old != NULL )
  26.        free (old);
  27.    return old=New;
  28. }


Título: Re: [Ayuda] Problema un poco sonso al intercambiar un puntero por otro.
Publicado por: pucheto en 12 Febrero 2011, 16:49 pm
Lo que en realidad queres pasarle a la funcion son punteros a punteros o referencias a punteros (en caso de ser C++)...


Título: Re: [Ayuda] Problema un poco sonso al intercambiar un puntero por otro.
Publicado por: BlackZeroX en 12 Febrero 2011, 21:28 pm

para reservar y liberar memoria en c++ tienes new y delete.


lo se.

Código
  1.  
  2. c_pstr=(char *)setnewptr(c_pstr,c_str);
  3.  
  4.  

Es lo que quiero evitar, ya que actualmente asi es como lo estoy haciendo.

Lo que quiero evitar es hacer una igualdad  asi a=b.

Dulces Lunas!¡.


Título: Re: [Ayuda] Problema un poco sonso al intercambiar un puntero por otro.
Publicado por: pucheto en 12 Febrero 2011, 22:20 pm
Vos no queres algo asi?
Código
  1.  
  2. void setnewptr( void* &old , void* &New){ //tomo referencias a puntero
  3.    if ( old != NULL )
  4.        free (old);
  5.    old=New;
  6. }
  7.  
  8. //y se usa:...
  9. void* p_viejo = ... ;
  10. void* p_nuevo = ... ;
  11.  
  12. setnewptr(p_viejo,p_nuevo);
  13.  
Otra forma es:
Código
  1.  
  2. void setnewptr( void** old , void** New){//tomo puntero a puntero
  3.    if ( *old != NULL )
  4.        free (*old);
  5.    *old=*New;
  6. }
  7.  
  8. //y se usa:...
  9. void* p_viejo = ... ;
  10. void* p_nuevo = ... ;
  11.  
  12. setnewptr(&p_viejo,&p_nuevo); //notece q lo que paso por parametro es un puntero a puntero
  13.  

Y la q mas me gusta:
Código
  1.  
  2. template<class T>
  3. void setnewptr( T* &old , T* &New){ //tomo referencias a puntero, pero ahora no hacen falta casteos a void*...
  4.    if ( old != NULL )
  5.        free (old);
  6.    old=New;
  7. }
  8.  
  9. //y se usa:...
  10. Tipo1* p_viejo = ... ;
  11. Tipo1* p_nuevo = ... ;
  12.  
  13. setnewptr(p_viejo,p_nuevo); //no me fije si compila, pero debe compilar, el compilador solo puede inferir el tipo...
  14.  


Título: Re: [Ayuda] Problema un poco sonso al intercambiar un puntero por otro.
Publicado por: BlackZeroX en 13 Febrero 2011, 07:19 am
.
@puchero

gracias no sabia eso de la referencia al puntero con el signo &.

Me quedare con esta.

Código
  1.  
  2. template<class T>
  3. T* setnewptr( T *&old , T *New)
  4. {
  5.    if ( old != NULL )
  6.        delete (old); // free (old);
  7.    return old=New;
  8. }
  9.  
  10.  

Temibles Lunas!¡.