|
Указатель на структуру, правильно-ли? |
|
|
|
Jul 7 2006, 11:52
|
Местный
  
Группа: Свой
Сообщений: 232
Регистрация: 22-02-06
Из: Воронеж
Пользователь №: 14 589

|
Здравствуйте. Подскажите пожалуйста допустимо-ли так делать на C(CodeVision)? Объявлена структура: Код struct TParameters { unsigned int ADC_Value; unsigned int temperature[2]; unsigned long suit;
unsigned int CRC16; };
struct TParameters Parameters; В main-е есть вот что: Код // передача данных в комп ptr = &Parameters; Parameters.CRC16 = CRC16(ptr, sizeof(Parameters) - 2); for (i=0;i<sizeof(Parameters);i++) { USART_Transmit(*ptr++); } // передать результаты измерений в УАРТ Интересует применимость работы со структурами через указатели. И еще CodeVision выдает warning"(358): suspicious pointer conversion" на строку "ptr = &Parameters;". Что это может означать? Спасибо.
--------------------
Истина рождается в спорах; но когда страсти кипят, истина испаряется.
|
|
|
|
|
Jul 7 2006, 11:59
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(otrog @ Jul 7 2006, 14:52)  Здравствуйте. Подскажите пожалуйста допустимо-ли так делать на C(CodeVision)? Объявлена структура: Код struct TParameters { unsigned int ADC_Value; unsigned int temperature[2]; unsigned long suit;
unsigned int CRC16; };
struct TParameters Parameters; В main-е есть вот что: Код // передача данных в комп ptr = &Parameters; Parameters.CRC16 = CRC16(ptr, sizeof(Parameters) - 2); for (i=0;i<sizeof(Parameters);i++) { USART_Transmit(*ptr++); } // передать результаты измерений в УАРТ Интересует применимость работы со структурами через указатели. И еще CodeVision выдает warning"(358): suspicious pointer conversion" на строку "ptr = &Parameters;". Что это может означать? Спасибо. Нет, неправильно. Вы должны объявить ptr как указатель на char и явно задать преобразование типа: Код ptr = (char *)&Parameters;
|
|
|
|
|
Jul 7 2006, 12:04
|
Местный
  
Группа: Свой
Сообщений: 232
Регистрация: 22-02-06
Из: Воронеж
Пользователь №: 14 589

|
Цитата(_Bill @ Jul 7 2006, 15:59)  Нет, неправильно. Вы должны объявить ptr как указатель на char и явно задать преобразование типа: Код ptr = (char *)&Parameters; Спасибо Код ptr = (char *)&Parameters; помогло  . указатель объявлен так: Код unsigned char *ptr; И всеже при обращении к структуре через указатель не будет-ли нарушаться порядок передачи байтов?
--------------------
Истина рождается в спорах; но когда страсти кипят, истина испаряется.
|
|
|
|
|
Jul 7 2006, 12:42
|

Профессионал
    
Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380

|
Цитата И всеже при обращении к структуре через указатель не будет-ли нарушаться порядок передачи байтов? Нет не будет. Но надо учитывать, что при разнотипных данных, они могут быть выровнены по длине наибольшего. Т.е. если между двумя int16 затешеться int8 компилятор дополнит его до 16 бит нулями. Обычно это некритично, но при обмене по последовательному каналу может неожиданно измениться длина посылки и смещение от начала. Следите за настройками компилятора. И вопрос от себя: Кто бы напомнил финт - читаю из внешней EEPROM, задавая адрес начала чтения. Хотелось бы описать содержимое EEPROM структурой и получать адрес чтения (смещение) из ее объявления.
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Jul 7 2006, 12:54
|
Частый гость
 
Группа: Участник
Сообщений: 96
Регистрация: 24-09-05
Пользователь №: 8 901

|
Цитата(beer_warrior @ Jul 7 2006, 16:42)  И вопрос от себя: Кто бы напомнил финт - читаю из внешней EEPROM, задавая адрес начала чтения. Хотелось бы описать содержимое EEPROM структурой и получать адрес чтения (смещение) из ее объявления. Насчёт такого финта незнаю  , для этих целей я использую макросы.
|
|
|
|
|
Jul 7 2006, 15:11
|

Профессионал
    
Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380

|
Цитата Только не с AVR. Это семейство 8-битное и выравнивания данных в структурах не осуществляется. Вот с ARM - другое дело. Не знаю как где, а gcc запросто - накалывался. Есть и второй момент - приведенная структура явно описывает данные для обмена, и скорее всего с писюком, для которого это актуально. Цитата x = offsetof(__struct__, __field__); Совершенно верно, только как это ручками написать? Когда-то, где-то подсмотрел, но уже забыл
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Jul 7 2006, 15:14
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Ничё не знаю. Я прямо так и пишу в ИАРе под АРМ. А вот как это описано в файле stddef.h Код #ifndef offsetof #define offsetof(T, member) (__INTADDR__((&((T *)0)->member))) #endif /* offsetof */ Тока не пойму зачем там лишняя пара скобок? Вторая, если считать снаружи.
Сообщение отредактировал GetSmart - Jul 7 2006, 15:26
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jul 11 2006, 06:31
|
Местный
  
Группа: Свой
Сообщений: 232
Регистрация: 22-02-06
Из: Воронеж
Пользователь №: 14 589

|
Спасибо всем ответившим. Но сомнения остались: Цитата Но надо учитывать, что при разнотипных данных, они могут быть выровнены по длине наибольшего. Т.е. если между двумя int16 затешеться int8 компилятор дополнит его до 16 бит нулями. Обычно это некритично, но при обмене по последовательному каналу может неожиданно измениться длина посылки и смещение от начала. Следите за настройками компилятора. Кстати в моей структуре смешаны unsigned int и unsigned longКод struct TParameters { unsigned int ADC_Value; unsigned int temperature[2]; unsigned long suit;
unsigned int CRC16; };
struct TParameters Parameters; Это вызовет выравнивание до unsigned long? Цитата Только не с AVR. Это семейство 8-битное и выравнивания данных в структурах не осуществляется. Вот с ARM - другое дело. Т.е. если я одинаковую структуру подсуну разным компиляторам(для разного железа, напр. AVR и IBM PC), то при обмене структурами через UART посредством указателя, я получу несовместимые друг с другом системы? Как же тогда быть?
--------------------
Истина рождается в спорах; но когда страсти кипят, истина испаряется.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|