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

 

 


Tema destacado: Sigue las noticias más importantes de seguridad informática en el Twitter! de elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  ¿Es normal hacer este tipo de conversiones de punteros void?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 3 Ir Abajo Respuesta Imprimir
Autor Tema: ¿Es normal hacer este tipo de conversiones de punteros void?  (Leído 8,083 veces)
samur88

Desconectado Desconectado

Mensajes: 125


Ver Perfil
¿Es normal hacer este tipo de conversiones de punteros void?
« en: 16 Mayo 2011, 15:27 pm »

Hola, tengo la siguiente duda:

En una funcion convierto los punteros void según lo necesite, es decir según el que le pase, lo que no se si es esto es una practica aceptada en C, compilar y funcionar funciona pero no se si debe hacer o no, o hacer esto puede acarrear fallos en algunos programas.
Me gustaría saber si es algo así como una practica que se puede hacer pero que debe evitarse en el mayor de los casos.

Esta es la función, lo que hago es convertir al tipo "medicos" o "pacientes" dependiendo de si "opc" es 0 u 1.
Al hacer la llamada solo el puntero que le pase a la función puede ser tanto del tipo
"medicos" como del "pacientes".
Código
  1. bool val_dni(void *primero,int dni,bool opc){
  2.    medicos *auxM;
  3.    pacientes *auxP;
  4.    int m = 0;
  5.    int p = 0;
  6.    /* 0 para medicos, 1 para pacientes.
  7.        0 si no existe, 1 si existe.  
  8.     */
  9.  
  10.    if(opc == 1){
  11.  
  12.           auxP = (pacientes *)primero;
  13.           while(auxP != NULL){
  14.                        if(auxP->dni == dni){ return 1; }
  15.                        auxP = auxP->next;
  16.                     }
  17.           return 0;
  18.    }else{
  19.          auxM = (medicos *)primero;
  20.          while(auxM != NULL){
  21.                        if(auxM->dni == dni){return 1; }
  22.                        auxM = auxM->next;
  23.                     }
  24.          return 0;
  25.    }
  26. }

Un saludo.


En línea

Queta

Desconectado Desconectado

Mensajes: 267



Ver Perfil
Re: ¿Es normal hacer este tipo de conversiones de punteros void?
« Respuesta #1 en: 16 Mayo 2011, 18:09 pm »

Citar
The void type of pointer is a special type of pointer. In C++, void represents the absence of type, so void pointers are pointers that point to a value that has no type (and thus also an undetermined length and undetermined dereference properties).

This allows void pointers to point to any data type, from an integer value or a float to a string of characters. But in exchange they have a great limitation: the data pointed by them cannot be directly dereferenced (which is logical, since we have no type to dereference to), and for that reason we will always have to cast the address in the void pointer to some other pointer type that points to a concrete data type before dereferencing it.

http://www.cplusplus.com/doc/tutorial/pointers/


En línea

"Intenta no volverte un hombre de éxito, sino volverte un hombre de valor." Albert Einstein.
samur88

Desconectado Desconectado

Mensajes: 125


Ver Perfil
Re: ¿Es normal hacer este tipo de conversiones de punteros void?
« Respuesta #2 en: 16 Mayo 2011, 18:54 pm »

Muchas gracias, no estoy seguro de haberlo entendido bien, pero creo que es algo así como que lo puedo usar para punteros que apunten a un dato el cual yo no voy a modificar desde una función, si no solo a comprobar su valor, como en mi caso, pero no podría usarlo por ejemplo para punteros que apuntaran a otro puntero con el fin de modificar el valor de este ultimo.

¿Lo he entendido bien?

Un saludo.
En línea

pucheto

Desconectado Desconectado

Mensajes: 215


Ver Perfil
Re: ¿Es normal hacer este tipo de conversiones de punteros void?
« Respuesta #3 en: 16 Mayo 2011, 20:40 pm »

Si, se pueden usar asi, no esta mal... Pero hay mejores ideas, como usar una struct con una union y con un flag q te indique el tipo.
En línea

samur88

Desconectado Desconectado

Mensajes: 125


Ver Perfil
Re: ¿Es normal hacer este tipo de conversiones de punteros void?
« Respuesta #4 en: 16 Mayo 2011, 22:40 pm »

Muchas gracias, ¿como es eso  :D? ¿Podrías ponerme un ejemplo por favor?
Mas o menos me situó pero no se como picar el código xD

Quieres decir una estructura con un enum dentro que contendría dos elementos, médicos y pacientes, ¿no? ¿Pero como hago para saber el tipo?
En línea

pucheto

Desconectado Desconectado

Mensajes: 215


Ver Perfil
Re: ¿Es normal hacer este tipo de conversiones de punteros void?
« Respuesta #5 en: 17 Mayo 2011, 04:12 am »

Quieres decir una estructura con un enum dentro que contendría dos elementos, médicos y pacientes, ¿no? ¿Pero como hago para saber el tipo?
Casi! un enum para indicar el tipo, y despues una union con puntero a medico y un puntero a paciente, y segun sea se usa uno u el otro elegis cual usas ( la union solo sirve para no andar haciendo casts, y el puntero a medico y a paciente ocuparian el mismo espacio de memoria... si lees un poco mas de uniones vas a entender q es lo q digo )
En línea

samur88

Desconectado Desconectado

Mensajes: 125


Ver Perfil
Re: ¿Es normal hacer este tipo de conversiones de punteros void?
« Respuesta #6 en: 17 Mayo 2011, 19:54 pm »

Gracias, ¿sería algo así?:

Código
  1. struct punteros_l {
  2. medicos *primeroM;
  3. pacientes *primeroP;
  4. }
  5.  
  6. union punteros_l punteros;
  7.  
  8. enum opcion (0 = punteros.primeroM,1 = punteros.primeroP);
  9.  
Es que me parece muy interesante lo que dices y quiero llegar a comprenderlo.
En línea

pucheto

Desconectado Desconectado

Mensajes: 215


Ver Perfil
Re: ¿Es normal hacer este tipo de conversiones de punteros void?
« Respuesta #7 en: 18 Mayo 2011, 04:56 am »

Código
  1. union {
  2.    medicos* m;
  3.    pacientes* p;
  4. }p_e;
  5.  
  6. struct persona {
  7.    p_e data;
  8.    tipo_persona flag;
  9. } personaHospital;
  10.  

pseudocodigo...

Código
  1. personaHospital p = /*... hago lo q tengo q hacer, inicializo y demas*/
  2.  
  3. switch(p.flag){
  4.    case f_medico:
  5.         //lo manejo como medico
  6.        handleMedico(m.data.m);
  7.        break;
  8.    case f_paciente:
  9.         //lo manejo como paciente
  10.        handlePaciente(m.data.p);
  11.        break;
  12. }
  13.  

me falto definir el enum tipo_persona, pero se entiende masomenos... No esperes q compile, es pseudocodigo puesto asi nomas para ejemplificar.
En línea

samur88

Desconectado Desconectado

Mensajes: 125


Ver Perfil
Re: ¿Es normal hacer este tipo de conversiones de punteros void?
« Respuesta #8 en: 18 Mayo 2011, 20:50 pm »

Muchas gracias, pero ¿el enum para que serviría?
En línea

pucheto

Desconectado Desconectado

Mensajes: 215


Ver Perfil
Re: ¿Es normal hacer este tipo de conversiones de punteros void?
« Respuesta #9 en: 18 Mayo 2011, 21:46 pm »

Para indicar q puntero tenes q usar... y distinguir si es paciente o medico...
En línea

Páginas: [1] 2 3 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayuda para hacer firmas d este tipo
Diseño Gráfico
bautistasbr 2 2,037 Último mensaje 8 Agosto 2006, 13:42 pm
por Ozonox
¿Como hacer este tipo de animacion?
Diseño Gráfico
NHME 5 3,573 Último mensaje 12 Noviembre 2007, 16:17 pm
por Azielito
como hacer firmas de este tipo
Diseño Gráfico
darkvidhack 2 3,216 Último mensaje 1 Septiembre 2009, 17:23 pm
por darkvidhack
¿Cómo hacer este tipo de htaccess para urls?
Desarrollo Web
robe007 0 1,315 Último mensaje 27 Abril 2012, 21:41 pm
por robe007
como hacer este tipo de paginas??
Desarrollo Web
Elmonky 3 2,392 Último mensaje 18 Junio 2012, 00:14 am
por darkvidhack
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines