Tengo esta pieza de código C (Параграф plataformas MSP430, compilador cl430):
void function(uint8_t * x){
// Esta variable está definida en el archivo linker file como "X_ADDR = 0xE000;"
extern uint32_t X_ADDR;
uint16_t i = 0;
uint16_t size = 10;
uint32_t dst_addr = (uint32_t) &X_ADDR;
for (i=0; i < size; i++){
*((uint8_t *) (dst_addr+i)) = *(x+i); // <-- Esta línea muestra la advertencia
}
Lo que entiendo es esto, aunque creo que estoy equivocado aquí:
*((uint8_t *) (dst_addr+i)) = *(x + i);
| | | |
V V V V
*((uint8_t *) (u32 + u16)) = *(u8*+u16);
*((uint8_t *) (u32)) = *(u8*);
*(u8*) = u8;
u8 = u8;
Esta plataforma es de 16 bits pero soporta un modo extendido de direccionamiento de 20 bits.
¿Alguna opinión al respecto? y сер ¿Cómo debería escrito?
Gracias de antemano
Составители предупреждают о возможно не умышленная pГ©rdida precisiГіn в ней conversiГіn:
cast to
uint8_t *
(akaunsigned char *
) from smaller integer typeunsigned int
[-Wint-to-pointer-cast]
cast to пойнтер from integer of different size [-Wint-to-pointer-cast]
Указатели обычно имеют tamaГ±o слово процессора . В типах архитектуры из 64 бит serГЎ целое число 64 бит ([u]int64_t
), что serГЎ mГЎs большой, что tamaГ±o int
(которые он обычно представлен [u]int32_t
).
Поэтому дает тревогу после того, как конвертирует типы различных tamaГ±os, compruГ©balos:
#include <stdint.h>
#define T(X) printf("Tamanyo de " #X " = %d\n", sizeof(X))
int main()
{
T(uint8_t); // Tamanyo de uint8_t = 1
T(uint16_t); // Tamanyo de uint16_t = 2
T(uint32_t); // Tamanyo de uint32_t = 4
T(uint8_t*); // Tamanyo de uint8_t* = 8
T(uint16_t*); // Tamanyo de uint16_t* = 8
T(uint32_t*); // Tamanyo de uint32_t* = 8
}
, Чтобы предотвращать проблему, способствуй тому, чтобы dst_addr
был указателем, который в конце концов является тем, что ты хочешь:
void function(uint8_t * x){
uint16_t i = 0;
uint16_t size = 10;
uint32_t* dst_addr = 0; // dummy value
// ^^^^^^^^^ <--- Puntero
for (i=0; i < size; i++){
*((uint8_t *) (dst_addr+i)) = *(x+i);
}
}