Convertir void* à double
Je suis en essayant d'utiliser le pthread
bibliothèque pour calculer n
nombres de fibonacci où n
peut être de gamme 0-1000
. Je suis en cours d'exécution dans une étrange erreur quand j'essaie de transtypage de mon void*
à un double
.
Dans mon principal ici est de mon appel à mon calculer la fonction de fibonacci:
pthread_create(&tid, &attr, calc_fib, (void *)n);
Dans mon calc_fib
fonction que j'essaie de transtypage avec:
void *calc_fib( void *num)
{
double n;
n = (double)num;
...
Cependant, quand j'essaye de faire cela, j'obtiens les erreurs suivantes:
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
Suis-je pas capable de transtypage de void*
à double
en C ou suis-je seulement fait-il mal?
Vous devez vous connecter pour publier un commentaire.
void *num
est un pointeur.double n
est une variable.Vous pouvez lancer
void*
àdouble*
:Alors vous déréférencement d'elle:
Ou en une seule ligne:
D'abord, vous voulez convertir le void* double*. Alors vous avez besoin de déréférencer le pointeur à l'attribuer à un double.
Vous ne pouvez pas portably cast le
double
à un pointeur - pour commencer, le type de pointeur peut ne pas avoir assez de bits.Si
n
ne seront pas modifiées àmain
après l'appel depthread_create
, vous pouvez passer un pointeur vers lan
variable dansmain
lui-même (c'est à dire(void*)&n
, puis utilisez*(double*)num
à l'intérieur decalc_fib
).Si
n
peut changer - vous avez peut-être une boucle de calcul d'une série de n valeurs à transmettre aux différents threads que vous frayer, vous devez alors éviter une situation de concurrence où le nouveau thread pourrait ne pas avoir lu la valeur avant que le thread principal, elle remplace. Vous pouvez utiliser un mutex pour cela -, il signifie qu'il y a un montant fixe de mémoire nécessaire indépendamment du nombre de threads - mais le code est relativement détaillé et serialises et ralentit le lancement des threads. Une meilleure approche est de mettre chaque valeur dans une adresse mémoire distinct. Vous pouvez utiliser un tableau avec toutes les valeurs que vous aurez de nouveaux threads, ou d'allouer de la mémoire sur le tas pour chaquedouble
puis laissez-les threads de lecture, puis relâchez que de la mémoire....