<div>Hola Matías,</div>
<div><br> </div>
<div class="gmail_quote">2010/5/6 Matias V. <span dir="ltr"><<a href="mailto:fockewulffw44j@gmail.com">fockewulffw44j@gmail.com</a>></span><br>
<blockquote style="BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex; PADDING-LEFT: 1ex" class="gmail_quote">
<div>Hola tengo la siguiente duda,</div>
<div> </div>
<div>Supongamos que tengo la siguiente funcion</div>
<div> </div>
<div>int prueba(void(*algo)(void*))</div>
<div>{</div>
<div>   int a=5;</div>
<div>   </div>
<div>   (*algo)(&a);</div></blockquote>
<div> </div>
<div> </div>
<div>Esto no es necesario en C/C++. Simplemente escribe:<br><br>algo( &a );</div>
<div> </div>
<div> </div>
<blockquote style="BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex; PADDING-LEFT: 1ex" class="gmail_quote">
<div>}</div>
<div>   </div>
<div>y por ejemplo esta otra</div>
<div> </div>
<div>void ejemplo(int * b)</div>
<div>{</div>
<div>    printf ("%i",*b);</div>
<div>}</div>
<div> </div>
<div>en el main invoco a prueba haciendo un cast:</div>
<div> </div>
<div>int main()</div>
<div>{</div>
<div>  prueba( (void(*)(void*))ejemplo);</div>
<div>}</div>
<div> </div>
<div>lo que no entiendo es por que todo funciona correctamente, es decir al hacer el cast el argumento de ejemplo  (de acuerdo a lo que tengo entendido) se convierte en un puntero void por lo cual el compilador me debería tirar error al intenetar imprimir el contenido de una varible apuntada por un puntero void, tal </div>
</blockquote>
<div> </div>
<div> </div>
<div>Bueno, teóricamente, en este caso, no se convierte en 'void *', sino más bien el argumento es tratado como si fuese de tipo 'void *'.</div>
<div> </div>
<div> </div>
<blockquote style="BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex; PADDING-LEFT: 1ex" class="gmail_quote">
<div>como ocurre en este ejemplo.</div>
<div> </div>
<div>void funcion(void* asd)</div>
<div>{</div>
<div>   printf("%i",*asd)</div></blockquote>
<div> </div>
<div> </div>
<div>Aquí sí tenemos un error porque intentas acceder al elemento apuntado por 'asd'. Sin embargo, el compilador no sabe cuántos bytes ocupa la información ni tampoco cómo manipularla, por el mero hecho de que no sabe el tipo del dato apuntado.</div>

<div> </div>
<div>Si sólo manipulas los punteros y direcciones de memoria, entonces puedes hacer cástings entre punteros: 'int *' a 'void *' y viceversa; 'float *' a 'void *' y viceversa; etcétera. En cuanto intentes acceder a la información apuntada, entonces el compilador echa mano al tipo apuntado para determinar cuántos bytes necesita leer o escribir.</div>

<div> </div>
<div>Una posible solución para este error, es realizar un cásting a 'int *', para poder acceder al número entero correctamente. Esto es,</div>
<div> </div>
<div>
<div>void funcion( void *asd )</div>
<div>{</div>
<div>   printf( "%i", *((int*)asd) );</div>
<div>}</div>
<div> </div></div>
<div> </div>
<blockquote style="BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex; PADDING-LEFT: 1ex" class="gmail_quote">
<div>}</div>
<div>int main()</div>
<div>{</div>
<div>   int a=5;</div>
<div>   funcion(&a);</div>
<div>}</div>
<div>  </div>
<div> </div></blockquote>
<div> </div>
<div> </div>
<div>En tu código original, no accedes al valor apuntado por el 'void *', sino al número entero apuntado por 'int *' en la función 'ejemplo()'. Por esta razón, no se produce ningún error.</div>
<div> </div>
<div> </div>
<div>Espero haber aclarado la duda.</div>
<div> </div>
<div>Steven</div>
<div> </div></div>