Convertion d'uintptr_t en uint8_t*
Bonjour ! Dans un de mes programmes , a un endroit (introduction hyper concise :mouarf:), l'on utilise de l'arithmétique de pointeurs pour calculer une donnée en mémoire. L'expression de calcul , évaluée par le compilateur comme étant un uintptr_t , "disparait" lors du
reinterpret_cast<>() . L'expression semble être valide, quelques std::cout a l'appui , cepandant , la cast a l'air d'absorber cette expression , donnant lors d'un cout , rien , pas meme 0 ou un espace....(le compilo' ne lance pas le warning "statement has no effect" par ailleur
8O
Code:
1 2 3 4 5
|
std::cout << (VMA_DMA_buffer+(i*SIZE_OF_SPR_STRUCT)+(3*sizeof(uint16_t))+sizeof(uint8_t)) << '\n' // affiche bien une addresse mémoire valide, et cohérente par rapport aux calculs
uint8_t* OffsetLargeur = reinterpret_cast<uint8_t *>(VMA_DMA_buffer+(i*SIZE_OF_SPR_STRUCT)+(3*sizeof(uint16_t))+sizeof(uint8_t));
//quelques autres calculs du même acabit, pour calculer d'autre pointeurs,"éffacés eux aussi" , OffsetLargeur n'y est pas impliqué
std::cout << OffsetLargeur << '\n' // mis pour le debug , est vide.... |
Le déréférencement de ces pointeurs vides montrent la valeur 0x00 , alors que l'addresse pointée par l'expression est remplie de 0xFF (le memory dump le confirme :aie:)
(précision si nécessaire, l'expression calcule l'emplacement de la Largeur d'un sprite dans une memory pool (VMA_DMA_buffer) en fonction du tour de boucle (i) la taille de la structure (SIZE_OF_SPR_STRUCT), et les
Code:
(3*sizeof(uint16_t))
et le sont les autres membres de la "structure" a retrouver.
La question est donc : Pourquoi est-ce que ca se fait absorber dans le néant absolu , et auxiliairement comment résoudre ca ??
EDIT : le debugger avec les Watchs montrents aucun changement , commence a l'état "rien" et continue sur cet état, et cela , même en release