[Ayuda] Problema un poco sonso al intercambiar un puntero por otro.

Iniciado por BlackZeroX, 12 Febrero 2011, 10:27 AM

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

BlackZeroX

.
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 (cpp) [Seleccionar]


#include<iostream>
#include<cstdlib>
#include<cstring>

using namespace std;

void* setnewptr( void *old , void *New);

int main() {
   char *c_pstr = NULL;
   char *c_str = (char*)malloc(sizeof(char)*10);
   strcpy(c_str , (const char*)"Hola");
   cout << (char*)setnewptr( c_pstr , c_str );
   cout << c_pstr << endl;
   return 0;
}

void* setnewptr( void *old , void *New)
/**
   Libera a [*old] si apunta a algo y le establece [*New];
   By BlackZeroX ( http://Infrangelux.sytes.net/ )
**/
{
   if ( old != NULL )
       free (old);
   return old=New;
}

The Dark Shadow is my passion.

diskontrol

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 (cpp) [Seleccionar]
#include<iostream>
#include<cstdlib>
#include<cstring>

using namespace std;

void* setnewptr( void *old , void *New);

int main() {
    char *c_pstr = NULL;
    char *c_str = (char*)malloc(sizeof(char)*10);
    strcpy(c_str , (const char*)"Hola");
    cout << (char*)setnewptr( c_pstr , c_str );
    c_pstr=(char *)setnewptr(c_pstr,c_str);
    cout << c_pstr << endl;
    return 0;
}

void* setnewptr( void *old , void *New)
/**
    Libera a [*old] si apunta a algo y le establece [*New];
    By BlackZeroX ( http://Infrangelux.sytes.net/ )
**/
{
    if ( old != NULL )
        free (old);
    return old=New;
}

Siempre ten tus cosas cuando las necesites con @Dropbox. ¡Una cuenta de 2 GB es gratis! http://db.tt/YxRhsCI

pucheto

Lo que en realidad queres pasarle a la funcion son punteros a punteros o referencias a punteros (en caso de ser C++)...

BlackZeroX

#3
Cita de: diskontrol en 12 Febrero 2011, 12:56 PM

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


lo se.

Código (cpp) [Seleccionar]


c_pstr=(char *)setnewptr(c_pstr,c_str);



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!¡.
The Dark Shadow is my passion.

pucheto

Vos no queres algo asi?
Código (cpp) [Seleccionar]

void setnewptr( void* &old , void* &New){ //tomo referencias a puntero
    if ( old != NULL )
        free (old);
    old=New;
}

//y se usa:...
void* p_viejo = ... ;
void* p_nuevo = ... ;

setnewptr(p_viejo,p_nuevo);

Otra forma es:
Código (cpp) [Seleccionar]

void setnewptr( void** old , void** New){//tomo puntero a puntero
    if ( *old != NULL )
        free (*old);
    *old=*New;
}

//y se usa:...
void* p_viejo = ... ;
void* p_nuevo = ... ;

setnewptr(&p_viejo,&p_nuevo); //notece q lo que paso por parametro es un puntero a puntero


Y la q mas me gusta:
Código (cpp) [Seleccionar]


template<class T>
void setnewptr( T* &old , T* &New){ //tomo referencias a puntero, pero ahora no hacen falta casteos a void*...
    if ( old != NULL )
        free (old);
    old=New;
}

//y se usa:...
Tipo1* p_viejo = ... ;
Tipo1* p_nuevo = ... ;

setnewptr(p_viejo,p_nuevo); //no me fije si compila, pero debe compilar, el compilador solo puede inferir el tipo...

BlackZeroX

#5
.
@puchero

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

Me quedare con esta.

Código (vb) [Seleccionar]


template<class T>
T* setnewptr( T *&old , T *New)
{
    if ( old != NULL )
        delete (old); // free (old);
    return old=New;
}



Temibles Lunas!¡.
The Dark Shadow is my passion.