elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [Ayuda] Problema un poco sonso al intercambiar un puntero por otro.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Ayuda] Problema un poco sonso al intercambiar un puntero por otro.  (Leído 3,165 veces)
BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
[Ayuda] Problema un poco sonso al intercambiar un puntero por otro.
« 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.  


« Última modificación: 12 Febrero 2011, 10:53 am por BlackZeroX▓▓▒▒░░ » En línea

The Dark Shadow is my passion.
diskontrol

Desconectado Desconectado

Mensajes: 89


RAWR!


Ver Perfil
Re: [Ayuda] Problema un poco sonso al intercambiar un puntero por otro.
« Respuesta #1 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. }


En línea

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

Desconectado Desconectado

Mensajes: 215


Ver Perfil
Re: [Ayuda] Problema un poco sonso al intercambiar un puntero por otro.
« Respuesta #2 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++)...
En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: [Ayuda] Problema un poco sonso al intercambiar un puntero por otro.
« Respuesta #3 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!¡.
« Última modificación: 12 Febrero 2011, 21:44 pm por BlackZeroX▓▓▒▒░░ » En línea

The Dark Shadow is my passion.
pucheto

Desconectado Desconectado

Mensajes: 215


Ver Perfil
Re: [Ayuda] Problema un poco sonso al intercambiar un puntero por otro.
« Respuesta #4 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.  
En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: [Ayuda] Problema un poco sonso al intercambiar un puntero por otro.
« Respuesta #5 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!¡.
« Última modificación: 13 Febrero 2011, 07:23 am por BlackZeroX▓▓▒▒░░ » En línea

The Dark Shadow is my passion.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayuda puntero
Programación C/C++
kworld 5 3,189 Último mensaje 26 Mayo 2010, 01:12 am
por nicolas_cof
Problema con puntero láser azul
Electrónica
danielpower 0 3,096 Último mensaje 9 Febrero 2012, 07:33 am
por danielpower
[AYUDA] Puntero de controles
Programación Visual Basic
Miseryk 4 2,300 Último mensaje 27 Marzo 2012, 07:23 am
por BlackZeroX
Problema con variables puntero
Programación C/C++
oxi12pek 7 3,214 Último mensaje 5 Noviembre 2012, 17:26 pm
por BatchianoISpyxolo
otro problema de matematica ... ayuda plis xD
Dudas Generales
gabrielprocs 4 2,609 Último mensaje 19 Septiembre 2014, 02:21 am
por simorg
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines