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:
if (flag == esMedico)
funcionMedico((struct medico*)puntero);
if (flag == esPaciente)
funcionPaciente((struct paciente*)puntero);
que es explícito en lo que hace, y no esto:
case f_medico:
//lo manejo como medico
handleMedico(m.data.m);
break;
case f_paciente:
//lo manejo como paciente
handlePaciente(m.data.p);
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:
void
funcion(void *punt ...) {
personaHospital p = (personaHospital) *punt; /* algo asi, que requiere una variable local p, o un puntero */
switch(p.flag){
case f_medico:
//lo manejo como medico
handleMedico(m.data.m);
break;
case f_paciente:
//lo manejo como paciente
handlePaciente(m.data.p);
break;
}
}
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