¿Es normal hacer este tipo de conversiones de punteros void?

Iniciado por samur88, 16 Mayo 2011, 15:27 PM

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

samur88

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".
bool val_dni(void *primero,int dni,bool opc){
    medicos *auxM;
    pacientes *auxP;
    int m = 0;
    int p = 0;
    /* 0 para medicos, 1 para pacientes.
       0 si no existe, 1 si existe.   
    */
   
    if(opc == 1){
               
           auxP = (pacientes *)primero;
           while(auxP != NULL){
                        if(auxP->dni == dni){ return 1; }
                        auxP = auxP->next;
                     }
           return 0;
    }else{
          auxM = (medicos *)primero;
          while(auxM != NULL){
                        if(auxM->dni == dni){return 1; }
                        auxM = auxM->next;
                     }
          return 0;
    }
}


Un saludo.

Queta

CitarThe 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/
"Intenta no volverte un hombre de éxito, sino volverte un hombre de valor." Albert Einstein.

samur88

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.

pucheto

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.

samur88

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?

pucheto

Cita de: samur88 en 16 Mayo 2011, 22:40 PM
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 )

samur88

Gracias, ¿sería algo así?:

struct punteros_l {
medicos *primeroM;
pacientes *primeroP;
}

union punteros_l punteros;

enum opcion (0 = punteros.primeroM,1 = punteros.primeroP);

Es que me parece muy interesante lo que dices y quiero llegar a comprenderlo.

pucheto


union {
    medicos* m;
    pacientes* p;
}p_e;

struct persona {
    p_e data;
    tipo_persona flag;
} personaHospital;


pseudocodigo...


personaHospital p = /*... hago lo q tengo q hacer, inicializo y demas*/

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;
}


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

samur88


pucheto

Para indicar q puntero tenes q usar... y distinguir si es paciente o medico...