¿Por qué esta línea muestra “Недопустимое преобразование типов”?

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

2
задан 12.11.2019, 14:05
1 ответ

Составители предупреждают о возможно не умышленная pГ©rdida precisiГіn в ней conversiГіn:

clang

cast to uint8_t * (aka unsigned char *) from smaller integer type unsigned int [-Wint-to-pointer-cast]

gcc

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);
    }
}
2
ответ дан 01.12.2019, 12:23
  • 1
    Привет, спасибо за ответ. Я существую añ adido немного больше детали. Относительно относиться к переменной как к указателю, я предпочитаю делать aritmé костариканская с целыми числами, так как в конце концов я нуждаюсь в том, чтобы написать на уровне байт (8 бит). Aquí está спроси в SO , если ты хочешь проверить discusió n allí. – gustavovelascoh 08.11.2019, 01:10
  • 2
    @gustavovelascoh детали, который añ adido они не меняют ответ. Если ты хочешь снять тревогу, используй указатели. Если está s используя целые числа, чтобы относиться к ним как к указателям, obtendrá s ты тревожишь, независимо, которого ты предпочел. – PaperBirdMaster 08.11.2019, 09:18

Теги

Похожие вопросы