2012-10-03 43 views
5

Estoy intentando usar la biblioteca pthread para calcular n números de fibonacci donde n puede ser del rango 0-1000. Estoy corriendo a un extraño error cuando trato de encasillar mi void* en un double.Convertir void * a double

En mi principal aquí es mi llamada a mi función de cálculo de Fibonacci:

pthread_create(&tid, &attr, calc_fib, (void *)n); 

En mi función calc_fib Estoy intentando encasillado con:

void *calc_fib(void *num) 
{ 
    double n; 
    n = (double)num; 
    ... 

Sin embargo, cuando intento hacer esto Obtengo los siguientes errores:

In function ‘calc_fib’: 
error: pointer value used where a floating point value was expected 
In function ‘main’: 
error: cannot convert to a pointer type 

No puedo ty pecast de void* a double en C o simplemente lo estoy haciendo mal?

Respuesta

11

void *num es un puntero. double n es una variable.

Puedes lanzar void* a double*:

double *p = (double *)num; 

Entonces deferenciarlo:

double n = *p; 

O en una sola línea:

double n = *(double *)num; 
+0

Sí, eso fue exactamente. Siempre me olvido de las sutilezas del lanzamiento entre diferentes tipos de punteros. –

2

Primero quiere convertir el vacío * a doble *. Luego necesita desreferenciar el puntero para asignarlo a un doble.

void *calc_fib(void *num) 
{ 
    double n; 
    n = *(double*)num; 
    ... 
1

No se puede emitir el portable double a un puntero - para empezar, el tipo de puntero puede no tener suficientes bits .

Si n no se cambiará en main después de llamar pthread_create, se puede pasar un puntero a la variable n en main sí mismo (es decir, (void*)&n, a continuación, utilizar *(double*)num dentro calc_fib).

Si n cambian - tal vez tenga un ciclo calculando una variedad de n valores para pasar a diferentes hilos que genere - entonces debe evitar una condición de carrera donde el nuevo subproceso podría no haber leído el valor antes del hilo principal lo reemplaza Puede usar un mutex para esto, significa que hay una cantidad fija de memoria necesaria independientemente del número de subprocesos, pero el código es relativamente detallado y además serializa y ralentiza el inicio de los subprocesos. Un enfoque típicamente mejor es poner cada valor en una dirección de memoria separada. Puede usar una matriz con tantos valores como tenga nuevos subprocesos, o asignar memoria en el montón para cada double luego deje que los hilos se lean y luego libere esa memoria ....

Cuestiones relacionadas