web-dev-qa-db-fra.com

avertissement: pointeur de type 'void *' utilisé en arithmétique

J'écris et lis des registres à partir d'une carte mémoire, comme ceci:

//READ
return *((volatile uint32_t *) ( map + offset ));

//WRITE
*((volatile uint32_t *) ( map + offset )) = value;

Cependant, le compilateur me donne des avertissements comme ceci:

warning: pointer of type ‘void *’ used in arithmetic [-Wpointer-arith]

Comment puis-je changer mon code pour supprimer les avertissements? J'utilise C++ et Linux.

11
user1876942

Puisque void* est un pointeur sur un type inconnu, vous ne pouvez pas faire d'arithmétique de pointeur dessus, car le compilateur ne sait pas quelle est la taille de la chose pointée.

Votre meilleur choix consiste à transtyper map en un type large d'un octet, puis à effectuer le calcul. Vous pouvez utiliser uint8_t pour cela:

//READ
return *((volatile uint32_t *) ( ((uint8_t*)map) + offset ));

//WRITE
*((volatile uint32_t *) ( ((uint8_t*)map)+ offset )) = value;
17
Sean

Le type vide est un type incomplet. Sa taille est inconnue. Donc, l'arithmétique de pointeur avec les pointeurs vers vide n'a aucun sens. Vous devez transtyper le pointeur pour écrire void en un autre type, par exemple pour pointer sur char. Tenez également compte du fait que vous ne pouvez pas attribuer un objet déclaré avec le qualificateur volatile.

6
Vlad from Moscow

Si l'utilisation de l'arithmétique sur les pointeurs de vide est vraiment ce que vous voulez, comme cela est rendu possible par GCC (voir Arithmétique sur les pointeurs de fonction et de fonction ), vous pouvez utiliser -Wno-pointer-arith pour supprimer l'avertissement.

1
Damien