Помогите привести указатель на объединение - PullRequest
2 голосов
/ 06 октября 2010

Я работаю над проектом C firmware.У меня есть объединение, которое определяется как

typedef union {
    unsigned long value;
    unsigned char bytes[4];
} LONGVALUE;

У меня также есть функция с этим прототипом,

char sendHexToASCII_UART(char *msg, int cnt);

и переменная типа LONGVALUE, определенная как

LONGVALUE countAddr;

ПРОБЛЕМА: Я заполняю отдельные байты переменной объединения значениями из массива (tempBuff1), затем я хочу передать адрес первого элемента в объединении функции, которая напечатает его в UART,При вызове функции sendHexToASCII_UART((int *)countAddr.bytes[0], 4); я получаю предупреждение компилятора, говорящее «приведение к указателю из целого числа разного размера».Может кто-нибудь объяснить, почему я получаю это и как я могу заставить его уйти?ПРИМЕЧАНИЕ: Изменение (int *) приведение к (char *) вызывает то же предупреждение.

countAddr.bytes[0] = tempBuff1[COUNT_ADDR - PWRD_ADDRESS];
countAddr.bytes[1] = tempBuff1[COUNT_ADDR - PWRD_ADDRESS + 1];
countAddr.bytes[2] = tempBuff1[COUNT_ADDR - PWRD_ADDRESS + 2];
countAddr.bytes[3] = tempBuff1[COUNT_ADDR - PWRD_ADDRESS + 3];
sendHexToASCII_UART((int *)countAddr.bytes[0], 4); 

Ответы [ 4 ]

4 голосов
/ 06 октября 2010

Почему бы просто:

sendHexToASCII_UART((char *)countAddr.bytes, 4);

или даже лучше:

sendHexToASCII_UART((char *)countAddr.bytes, sizeof(countAddr.bytes));
1 голос
/ 06 октября 2010

sendHexToASCII_UART ((int *) (& countAddr.bytes [0]), 4);

или

sendHexToASCII_UART ((int *) (countAddr.bytes), 4);

0 голосов
/ 06 октября 2010

или попробуйте это без создания переменной типа LONGVALUE

sendHexToASCII_UART(((LONGVALUE *)0)->bytes, 4);
0 голосов
/ 06 октября 2010

Значение выражения

countAddr.bytes[0]

- это беззнаковый символ (первый байт в вашем массиве), который вы приводите к указателю int, отсюда и предупреждение. Как сказал Оли, вы должны удалить [0], чтобы получить указатель на массив, который вам нужен.

...