Разработка, производство и продажа радиоэлектронной аппаратуры
|
Требуется программист в Зеленограде - обработка данных с датчиков; ColdFire; 40 тыс.
e-mail: jobsmp@pochta.ru
|
Вопрос по правильному извлечению указателя на структуру в массиве структур. IAR ругается и не работает...
Отправлено
Dikoy 19 марта 2008 г. 11:42
Вот кусок кода, предназначен он, чтобы в переменную temp16 поместить CRC-16 структуры Response, являющейся элементом массива IO_Buffer:
//------------------
#define BUFER_LENGTH 10
#define DATA_LENGTH_MAX 128
//------------------
typedef struct
{
unsigned char Address;
unsigned char Length;
unsigned char Cmd;
unsigned char Data[DATA_LENGTH_MAX];
unsigned char CRC_H;
unsigned char CRC_L;
} Response;
//-------------------------
Response IO_Buffer[BUFER_LENGTH];
unsigned int temp16;
//--------------------------
unsigned int GetCrc16(unsigned char *buf, unsigned char len)
{
unsigned int crc = 0xFFFF;
while (len--)
crc = (crc << 8) ^ Crc16Table[(crc >> 8) ^ *buf++];
return crc;
}
//------------------------------
temp16 = GetCrc16(&IO_Buffer[i], IO_Buffer[i].Length);
//-----END---------
На последней строчке IAR 4.30 ругается:
Error[Pe167]: argument of type "Response *" is incompatible with parameter of type "unsigned char *"
Попытки привести его к uchar:
temp16 = GetCrc16((unsigned char*)&IO_Buffer[i], IO_Buffer[i].Length);
ошибку убирают, но программа один фиг не работает. Помещаемый в temp16 CRC всегда равен 00B2, независимо от входящего сообщения.
Предполагаю, что косяк именно там... Помогите понять, где затык?
Составить ответ | Вернуться на конференцию
Ответы
- Если результат один и тот-же похоже на адрес. Попробуйте еще скобками проконкретезировать и отделить ++ от * и прочего. — 1111 (19.03.2008 14:25:46 86.57.155.2, пустое)
- Примерно так можно обойтись при упакованной структуре — Vit (19.03.2008 14:24:9 83.170.240.226, 139 байт)
- Мой примерец — 1111 (19.03.2008 14:08:5 86.57.155.2, 5824 байт)
- если не ошибаюсь то &IO_Buffer никогда не приведется к (unsigned char*) потому как IO_Buffer это не массив char-ов, а во вторых - зачем передавать в функицю и указатель на структуру и значение одного из ее полей? разве нельзя это значение извлечь в самой функции по указателю на структуру? — sva (19.03.2008 14:00:1 80.243.4.162, пустое)
- Не забудь ещё #pragma pack(1) перед структурой вставить — vitalyn (19.03.2008 13:21:47 195.140.182.162, 53 байт)
- Объявить unsigned int GetCrc16(Response *buf, unsigned char len) — MikeR (19.03.2008 13:12:13 80.79.176.57, пустое)
- Явно привести тип и ругаться на Это не будет(+) — Quasy (19.03.2008 11:50:23 80.243.9.34, 92 байт)
- при вызове нужно записать &IO_Buffer.buf — Vladimir Ljaschko (19.03.2008 11:50:11 194.158.204.49, пустое)