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

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  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,115 veces)
D4RIO


Desconectado Desconectado

Mensajes: 1.004


U N I X


Ver Perfil WWW
Re: ¿Es normal hacer este tipo de conversiones de punteros void?
« Respuesta #10 en: 19 Mayo 2011, 16:24 pm »

Obviamente, debes conocer las diferencias de tamaños para decidir si una union es buena idea o no, y saber si realmente necesitas ese almacenamiento. En ESTA situación, cualquier uso de uniones es DISPARATADO  ;D

¿Porqué?
Porque cuando aún no sabes si es un médico o un paciente, usas el flag para tratarlo. Entonces ¿realmente necesitas almacenar las estructuras en un espacio de memoria común? Sin importar el tipo, puedes tener dos funciónes diferentes, con lo que la función que hace de dispatcher, no tiene que hacer más que pasar el puntero a quien le corresponda... que me parece mucho más razonable  ;), y si quieres probar si es NULL, lo haces al principio, cosa que te quedaría como:

Código
  1. void
  2. funcion_dispatcher(void *puntero, tipo_dispatcher flag) {
  3.    if (!puntero)
  4.        muere("funcion_dispatcher: puntero nulo!");
  5.  
  6.    switch (flag) {
  7.        case esMedico:
  8.            funcionMedico((struct medico*)puntero);
  9.            break;
  10.        case esPaciente:
  11.            funcionPaciente((struct paciente*)puntero);
  12.            break;
  13.    }
  14. }

O lo que me parece más visible/lindo:
Código
  1. void
  2. funcion_dispatcher(void *puntero, tipo_dispatcher flag) {
  3.    if (!puntero)
  4.        muere("funcion_dispatcher: puntero nulo!");
  5.  
  6.    if (flag == esMedico)
  7.            funcionMedico((struct medico*)puntero);
  8.  
  9.    if (flag == esPaciente)
  10.            funcionPaciente((struct paciente*)puntero);
  11. }



En línea

OpenBSDFreeBSD
pucheto

Desconectado Desconectado

Mensajes: 215


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

Obviamente, debes conocer las diferencias de tamaños para decidir si una union es buena idea o no, y saber si realmente necesitas ese almacenamiento. En ESTA situación, cualquier uso de uniones es DISPARATADO  ;D
Estoy usando una union de punteros, no de structs... todos los punteros ocupan lo mismo, no hay ningun desperdicio de espacio (al menos q sean near, far etc, pero eso ya depende mucho del sistema y es raro encontrarlo en la programacion en modo usuario).

¿Porqué?
Porque cuando aún no sabes si es un médico o un paciente, usas el flag para tratarlo. Entonces ¿realmente necesitas almacenar las estructuras en un espacio de memoria común?
 Sin importar el tipo, puedes tener dos funciónes diferentes, con lo que la función que hace de dispatcher, no tiene que hacer más que pasar el puntero a quien le corresponda... que me parece mucho más razonable  ;), y si quieres probar si es NULL, lo haces al principio, cosa que te quedaría como....
Guardo el flag, con la union de punteros pq estan asociados, estan muy relacionados... Como estan tan relacionados, los pongo en el mismo struct...


« Última modificación: 19 Mayo 2011, 17:17 pm por pucheto » En línea

D4RIO


Desconectado Desconectado

Mensajes: 1.004


U N I X


Ver Perfil WWW
Re: ¿Es normal hacer este tipo de conversiones de punteros void?
« Respuesta #12 en: 19 Mayo 2011, 18:23 pm »

Estoy usando una union de punteros, no de structs... todos los punteros ocupan lo mismo, no hay ningun desperdicio de espacio (al menos q sean near, far etc, pero eso ya depende mucho del sistema y es raro encontrarlo en la programacion en modo usuario).
Guardo el flag, con la union de punteros pq estan asociados, estan muy relacionados... Como estan tan relacionados, los pongo en el mismo struct...
No había visto lo de los punteros. Pero no quita lo que decía, porque usar un "union" donde siempre se usará un puntero, y acceder luego a sus miembros es a fin de cuentas... un casteo. Y si vamos a hacer un casteo es mejor ser explícitos.

Por otro lado, no están más relacionados de lo que significa pasar por un mismo dispatcher, porque al final serán tratados por funciónes diferentes. Como al fin y al cabo, usas el union para "castear" el puntero contenido en ese espacio de memoria (el union)...
Código
  1. switch(p.flag){
  2.    case f_medico:
  3.         //lo manejo como medico
  4.        handleMedico(m.data.m);
  5.        break;
  6.    case f_paciente:
  7.         //lo manejo como paciente
  8.        handlePaciente(m.data.p);
  9.        break;
  10. }
...entonces resulta más legible ir al grano con un cast. A demás, al usar esta forma tienes dos problemas a tener en cuenta:

1 - Necesitas una variable extra en la pila local de la función... solo a fin de alojar el puntero que te llega por parámetro, y para enviarlo a otra función. Es innecesario.
2 - Si declaras desde el main los datos como instancias de la union para evitar las variables locales innecesarias, pierdes la posibilidad de tener flujos donde se manejen solo pacientes, o solo médicos (en el ejemplo), sin pasar previamente por un dispatcher. Si los dispatchers son siempre necesarios, es porque tienes dos flujos separados. Seguramente perderás más de dos bytes haciendo dispatchers para cada flujo, y es la diferencia entre crear una instancia de cada tipo, y una union.

Si se desea castear un puntero, entonces se usa un cast, solo por mantener el código simple.

Saludos
En línea

OpenBSDFreeBSD
pucheto

Desconectado Desconectado

Mensajes: 215


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

1 - Necesitas una variable extra en la pila local de la función... solo a fin de alojar el puntero que te llega por parámetro, y para enviarlo a otra función. Es innecesario.
Una cosa que no veo aca, hagas como hagas, si o si vas a tener que pasarle el puntero a la otra funci\'on. No veo donde esta el problema. En tu codigo tambien tenes que pasar el puntero a una funcion.

2 - Si declaras desde el main los datos como instancias de la union para evitar las variables locales innecesarias, pierdes la posibilidad de tener flujos donde se manejen solo pacientes, o solo médicos (en el ejemplo), sin pasar previamente por un dispatcher. Si los dispatchers son siempre necesarios, es porque tienes dos flujos separados. Seguramente perderás más de dos bytes haciendo dispatchers para cada flujo, y es la diferencia entre crear una instancia de cada tipo, y una union.

Si se desea castear un puntero, entonces se usa un cast, solo por mantener el código simple.

Saludos
Tampoco veo pq se pierde la posibilidad de tener secciones donde solo se manejan solo medicos o solo pacientes.

Si podes pone un ejemplo donde se vea mejor.
En línea

samur88

Desconectado Desconectado

Mensajes: 125


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

Una cosa, que me he liado, entonces que sería mas optimo hacer el cast directamente o hacer lo que propone pucheto mediante uniones y estructuras.

Un saludo y gracias por las respuestas.
En línea

D4RIO


Desconectado Desconectado

Mensajes: 1.004


U N I X


Ver Perfil WWW
Re: ¿Es normal hacer este tipo de conversiones de punteros void?
« Respuesta #15 en: 19 Mayo 2011, 21:25 pm »

El cast directamtnte es mejor.


Una cosa que no veo aca, hagas como hagas, si o si vas a tener que pasarle el puntero a la otra funci\'on. No veo donde esta el problema. En tu codigo tambien tenes que pasar el puntero a una funcion.
No fue lo que expuse. La diferencia, aclaro, es que necesitas una variable local para usar la union.

Tampoco veo pq se pierde la posibilidad de tener secciones donde solo se manejan solo medicos o solo pacientes.

Si podes pone un ejemplo donde se vea mejor.
Este sería el otro caso. Si no usas una variable local, pasas las uniones desde que las creas... probablemente desde el main. Entonces, si una función o grupo de funciones trabajan con "struct paciente", necesitas una funcion intermediaria (un dispatcher), que les pase el puntero. Eso significa una funcion para adaptar a cada flujo que use solo una estructura, cosa que no pasaría si las estructuras fueran siempre diferentes. Solo los flujos que aceptan ambos tipos necesitan el dispatcher.

Saludos
En línea

OpenBSDFreeBSD
Littlehorse
All the world's a stage
Moderador
***
Desconectado Desconectado

Mensajes: 2.714


Nie Dam Sie


Ver Perfil WWW
Re: ¿Es normal hacer este tipo de conversiones de punteros void?
« Respuesta #16 en: 19 Mayo 2011, 23:49 pm »

Dependiendo el problema depende que solución es mas aceptable, y esto ultimo siempre va a ser subjetivo. Personalmente para este caso en particular me parece mas correcta la idea de Pucheto que hacer un cast directo. Tal vez las ventajas del planteo de Pucheto no son tan visibles en 10 lineas pero se notarían si tenes que ponerte al día en un proyecto relativamente extenso y encima mantenerlo, aunque esto por supuesto depende de cada uno.

Saludos
« Última modificación: 19 Mayo 2011, 23:54 pm por Littlehorse » En línea

An expert is a man who has made all the mistakes which can be made, in a very narrow field.
pucheto

Desconectado Desconectado

Mensajes: 215


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

El cast directamtnte es mejor.

No fue lo que expuse. La diferencia, aclaro, es que necesitas una variable local para usar la union.
Este sería el otro caso. Si no usas una variable local, pasas las uniones desde que las creas... probablemente desde el main. Entonces, si una función o grupo de funciones trabajan con "struct paciente", necesitas una funcion intermediaria (un dispatcher), que les pase el puntero. Eso significa una funcion para adaptar a cada flujo que use solo una estructura, cosa que no pasaría si las estructuras fueran siempre diferentes. Solo los flujos que aceptan ambos tipos necesitan el dispatcher.

Saludos
Del 1er punto sigo sin ver que variable local uso...
Del punto 2, si una funcion trabaja con un paciente solamente, le paso el puntero al paciente, no toda el struct con el flag... el struct con el flag solamente lo uso cuando tenga q manejar de manera generica a medicos y pacientes por igual, y tal vez aplicarle alguna funcion generica que necesite tratarlos de maneras distintas. Depende mucho del contexto de uso todo esto.
En línea

D4RIO


Desconectado Desconectado

Mensajes: 1.004


U N I X


Ver Perfil WWW
Re: ¿Es normal hacer este tipo de conversiones de punteros void?
« Respuesta #18 en: 20 Mayo 2011, 03:46 am »

Esto ya es un mareo. A ver:
Dependiendo el problema depende que solución es mas aceptable, y esto ultimo siempre va a ser subjetivo. Personalmente para este caso en particular me parece mas correcta la idea de Pucheto que hacer un cast directo. Tal vez las ventajas del planteo de Pucheto no son tan visibles en 10 lineas pero se notarían si tenes que ponerte al día en un proyecto relativamente extenso y encima mantenerlo, aunque esto por supuesto depende de cada uno.

Supongo que será por lo relativo, pero yo, siendo nuevo en un proyecto, preferiría mil veces encontrar esto:
Código
  1.    if (flag == esMedico)
  2.            funcionMedico((struct medico*)puntero);
  3.  
  4.    if (flag == esPaciente)
  5.            funcionPaciente((struct paciente*)puntero);

que es explícito en lo que hace, y no esto:
Código
  1.    case f_medico:
  2.        //lo manejo como medico
  3.        handleMedico(m.data.m);
  4.        break;
  5.    case f_paciente:
  6.        //lo manejo como paciente
  7.        handlePaciente(m.data.p);
  8.        break;

que es como... poco claro, a mi parecer.


Del 1er punto sigo sin ver que variable local uso...
Si no lo entiendo mal, recibes un puntero en la función, y haces algo como:
Código
  1. void
  2. funcion(void *punt ...) {
  3.    personaHospital p = (personaHospital) *punt; /* algo asi, que requiere una variable local p, o un puntero */
  4.  
  5.    switch(p.flag){
  6.        case f_medico:
  7.            //lo manejo como medico
  8.            handleMedico(m.data.m);
  9.            break;
  10.        case f_paciente:
  11.            //lo manejo como paciente
  12.            handlePaciente(m.data.p);
  13.            break;
  14.    }
  15. }
  16.  

Que no era necesaria sin la union...

Del punto 2, si una funcion trabaja con un paciente solamente, le paso el puntero al paciente, no toda el struct con el flag... el struct con el flag solamente lo uso cuando tenga q manejar de manera generica a medicos y pacientes por igual, y tal vez aplicarle alguna funcion generica que necesite tratarlos de maneras distintas. Depende mucho del contexto de uso todo esto.
Creo que nunca se manejarían "por igual"... si tuvieran miembros en común que se manejen por igual, entonces metería algo como herencia. Una estructura compartida entre ambos al inicio de la estructura de cada uno. Y así los despachos con un único puntero siguen siendo válidos, aunque en realidad habrá código compartido tanto como código para cada implementación.

Estamos tratando de dar solución a ningún problema, creo que eso es lo más confuso  :)

Muestrame el código que pondrías para darme una mejor idea de tu idea.

Saludos
En línea

OpenBSDFreeBSD
pucheto

Desconectado Desconectado

Mensajes: 215


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

Ta, estabamos pensando distinto el problema... Yo suponia que el tipo 'personaHospital' venia ya de arriba, pq lo crea una funcion o algo asi... mi funcion con la version que yo proponia era tomar directamente el struct personaHospital, y no un puntero para despues convertirlo.

Mi idea era hacerlo algo similar a herencia.
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,052 Último mensaje 8 Agosto 2006, 13:42 pm
por Ozonox
¿Como hacer este tipo de animacion?
Diseño Gráfico
NHME 5 3,589 Último mensaje 12 Noviembre 2007, 16:17 pm
por Azielito
como hacer firmas de este tipo
Diseño Gráfico
darkvidhack 2 3,231 Último mensaje 1 Septiembre 2009, 17:23 pm
por darkvidhack
¿Cómo hacer este tipo de htaccess para urls?
Desarrollo Web
robe007 0 1,321 Último mensaje 27 Abril 2012, 21:41 pm
por robe007
como hacer este tipo de paginas??
Desarrollo Web
Elmonky 3 2,409 Último mensaje 18 Junio 2012, 00:14 am
por darkvidhack
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines