реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Указатель на структуру, правильно-ли?
otrog
сообщение Jul 7 2006, 11:52
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 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;".
Что это может означать?
Спасибо.


--------------------
Истина рождается в спорах; но когда страсти кипят, истина испаряется.
Go to the top of the page
 
+Quote Post
_Bill
сообщение Jul 7 2006, 11:59
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 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;
Go to the top of the page
 
+Quote Post
otrog
сообщение Jul 7 2006, 12:04
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 232
Регистрация: 22-02-06
Из: Воронеж
Пользователь №: 14 589



Цитата(_Bill @ Jul 7 2006, 15:59) *
Нет, неправильно. Вы должны объявить ptr как указатель на char и явно задать преобразование типа:
Код
   ptr = (char *)&Parameters;

Спасибо
Код
   ptr = (char *)&Parameters;

помогло cheers.gif .
указатель объявлен так:
Код
  unsigned char *ptr;

И всеже при обращении к структуре через указатель не будет-ли нарушаться порядок передачи байтов?


--------------------
Истина рождается в спорах; но когда страсти кипят, истина испаряется.
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Jul 7 2006, 12:42
Сообщение #4


Профессионал
*****

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



Цитата
И всеже при обращении к структуре через указатель не будет-ли нарушаться порядок передачи байтов?

Нет не будет. Но надо учитывать, что при разнотипных данных, они могут быть выровнены по длине наибольшего. Т.е. если между двумя int16 затешеться int8 компилятор дополнит его до 16 бит нулями.
Обычно это некритично, но при обмене по последовательному каналу может неожиданно измениться длина посылки и смещение от начала. Следите за настройками компилятора.


И вопрос от себя:
Кто бы напомнил финт - читаю из внешней EEPROM, задавая адрес начала чтения. Хотелось бы описать содержимое EEPROM структурой и получать адрес чтения (смещение) из ее объявления.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jul 7 2006, 12:51
Сообщение #5


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(beer_warrior @ Jul 7 2006, 15:42) *
Но надо учитывать, что при разнотипных данных, они могут быть выровнены по длине наибольшего. Т.е. если между двумя int16 затешеться int8 компилятор дополнит его до 16 бит нулями.
Обычно это некритично, но при обмене по последовательному каналу может неожиданно измениться длина посылки и смещение от начала. Следите за настройками компилятора.

Только не с AVR. Это семейство 8-битное и выравнивания данных в структурах не осуществляется.
Вот с ARM - другое дело.
Go to the top of the page
 
+Quote Post
unichorn
сообщение Jul 7 2006, 12:54
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 96
Регистрация: 24-09-05
Пользователь №: 8 901



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


Насчёт такого финта незнаю blink.gif , для этих целей я использую макросы.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jul 7 2006, 13:08
Сообщение #7


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Я не очень понял, что надо beer_warrior, но может это:

x = offsetof(__struct__, __field__);

__struct__ => структура типа
__field__ => поле внутри этой структуры


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Jul 7 2006, 15:11
Сообщение #8


Профессионал
*****

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



Цитата
Только не с AVR. Это семейство 8-битное и выравнивания данных в структурах не осуществляется.
Вот с ARM - другое дело.

Не знаю как где, а gcc запросто - накалывался.
Есть и второй момент - приведенная структура явно описывает данные для обмена, и скорее всего с писюком, для которого это актуально.
Цитата
x = offsetof(__struct__, __field__);

Совершенно верно, только как это ручками написать? Когда-то, где-то подсмотрел, но уже забыл sad.gif


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jul 7 2006, 15:14
Сообщение #9


.
******

Группа: Участник
Сообщений: 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


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Jul 7 2006, 15:34
Сообщение #10


Профессионал
*****

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



Именно то спасибо. А скобки... Это же весьма навороченный макрос, при вставке в текст приоритет операций может поменяться.
Макрос скобками не испортишь smile.gif


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jul 7 2006, 15:40
Сообщение #11


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



А вот и нет. Не внешние скобки. А сразу за внешними стоят двое подряд скобок. В этом какой-то смысл есть?


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 9 2006, 22:24
Сообщение #12


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата
Тока не пойму зачем там лишняя пара скобок? Вторая, если считать снаружи.

При беглом просмотре вроде нет в ней никакого смысла.
Попробуйте убрать ;>
Go to the top of the page
 
+Quote Post
otrog
сообщение Jul 11 2006, 06:31
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 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 посредством указателя, я получу несовместимые друг с другом системы?
Как же тогда быть?


--------------------
Истина рождается в спорах; но когда страсти кипят, истина испаряется.
Go to the top of the page
 
+Quote Post
unichorn
сообщение Jul 11 2006, 07:04
Сообщение #14


Частый гость
**

Группа: Участник
Сообщений: 96
Регистрация: 24-09-05
Пользователь №: 8 901



Неиспользовать для этих целей тип int и unsigned int. smile.gif
Заменить их на другой тип.

Сообщение отредактировал unichorn - Jul 11 2006, 07:05
Go to the top of the page
 
+Quote Post
vet
сообщение Jul 11 2006, 07:07
Сообщение #15


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



Прочитать хелп по #pragma pack и использовать любые типы, какие заблагорассудится.


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 15:36
Рейтинг@Mail.ru


Страница сгенерированна за 0.01519 секунд с 7
ELECTRONIX ©2004-2016