Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 28.01.2014
Сообщений: 56

Пример для микроконтроллера: с одной стороны это указатель ну структуру, с другой на обычный тип

16.08.2014, 02:20. Показов 1378. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
u8_t *uip_buf;
 
#define BUF                     ((struct uip_eth_hdr *)uip_buf)
Сначала uip_buf приводится к типу u8_t, потом к типу указателя на структуру (struct uip_eth_hdr *)
Разве так можно делать?)
А потом используется в самой программе таким образом
C++
1
uip_buf = (u8_t *)(((unsigned long)ucUIPBuffer + 3) & 0xfffffffe);
то есть мы ему присваиваем адрес, если я правильно понимаю, предпологая что он типа u8_t. И потом используем его как указатель на структуру
C++
1
if(BUF->type == htons(UIP_ETHTYPE_IP))
Это взято из примера на микроконтроллер.Никак не могу понять как правильно это понимать, с одной стороны это указатель ну структуру, с другой на обычный тип ...
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.08.2014, 02:20
Ответы с готовыми решениями:

С одной стороны 20+4, а с другой - 20
Здравствуйте! Решил удлинить кабель питания материнской платы, который 20+4 пин, т.к. из-за нижнего расположения БП он едва...

Нужен пример программы для PIC микроконтроллера
Здраствуйте! Помогите начинающему освоить pic микроконтроллер.А если точнее научите писать программу, в примерах.Для начала объясните...

Привязка объекта к точке с одной стороны и к курсору с другой
Добрейшего всем времени суток! Помогите, пожалуйста, решить проблему! Нужно сделать так, чтобы рука, с одной стороны, фиксировано...

3
 Аватар для Справлюсь
76 / 36 / 17
Регистрация: 24.07.2014
Сообщений: 357
16.08.2014, 08:10
Лучший ответ Сообщение было отмечено Axel1988 как решение

Решение

Цитата Сообщение от Axel1988 Посмотреть сообщение
Сначала uip_buf приводится к типу u8_t, потом к типу указателя на структуру (struct uip_eth_hdr *)
Разве так можно делать?)
можно. дело в том что и в int* и в char* и в double* одинаково хранится адреса переменных, разница состоит в том что для них по разному выполняются операции. пример:
C
1
2
char*(0x000001)+2==char*(0x000003)      sizeof(char)==1(байт)
int*(0x000001)+2==int*(0x000009)        sizeof(int)==4(байт)
и если переменную типа u8_t* приводят к типу struct uip_eth_hdr * то это означает только то что выражение ((struct uip_eth_hdr *)uip_buf)указует на память длиной sizeof(struct uip_eth_hdr)адрес остаётся темже. а переменная uip_buf как была типа uip_buf так и осталась.
судя по тому что вы спрашуете вам нужно пройтись еще по указателям и было бы интересно почитать про указатели на void.
кстати меня заинтерисовал второй отрывок из проги можете показать побольше, какой то интересный способ получения адреса.
0
0 / 0 / 0
Регистрация: 28.01.2014
Сообщений: 56
16.08.2014, 12:47  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#define SYSTICKHZ               CLOCK_CONF_SECOND
#define SYSTICKMS               (1000 / SYSTICKHZ)
#define SYSTICKUS               (1000000 / SYSTICKHZ)
#define SYSTICKNS               (1000000000 / SYSTICKHZ)
 
//*****************************************************************************
//
// Macro for accessing the Ethernet header information in the buffer.
//
//*****************************************************************************
u8_t ucUIPBuffer[UIP_BUFSIZE + 2];
u8_t *uip_buf;
 
#define BUF                     ((struct uip_eth_hdr *)uip_buf)
это инициализация


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
 ROM_SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
                       SYSCTL_XTAL_16MHZ);
 
    //
    // Adjust the pointer to be aligned on an odd half word address so that
    // DMA can be used.
    //
    uip_buf = (u8_t *)(((unsigned long)ucUIPBuffer + 3) & 0xfffffffe);
 
    //
    // Initialize the UART.
    //
    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
видимо здесь сы адрес выравниваем по 4 байтам

C++
1
2
3
4
5
struct uip_eth_hdr {
  struct uip_eth_addr dest;
  struct uip_eth_addr src;
  u16_t type;
};
сама структура


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 if(BUF->type == htons(UIP_ETHTYPE_IP))
            {
                uip_arp_ipin();
                uip_input();
 
                //
                // If the above function invocation resulted in data that
                // should be sent out on the network, the global variable
                // uip_len is set to a value > 0.
                //
                if(uip_len > 0)
                {
                    uip_arp_out();
                    EthernetPacketPutDMA(ETH_BASE, uip_buf, uip_len);
                    uip_len = 0;
                }
            }
здесь используется указатель

Добавлено через 1 час 26 минут
вроде разобрался...((struct uip_eth_hdr *)uip_buf) это тот же адрес,он не изменился просто мы имеем дело со структурой, когда так объявляем его)
Спасибо большое!
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,984
Записей в блоге: 32
16.08.2014, 14:47
Сам не проверял (хотя это дело пары секунд), но мне одна бабка сказала (С), что она программировала как-то микроконтроллеры, и столкнулась с тем, что по прихоти отцов-основателей языка структуры там оказалось можно присваивать по значению, а сравнивать - нельзя! В итоге она написала свою функцию сравнения структур - берутся указатели на обе структуры, переводятся в указатели на char и потом побайтово до самого конца sizeof структур пробегается сравнение - и безразлично за что именно отвечает данный байт данной структуры. Если байты не совпали - функция прерывается и возвращает несовпадение структур.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.08.2014, 14:47
Помогаю со студенческими работами здесь

Пример сложения двух чисел для микроконтроллера 8051
Уважаемые форумчане! Помогите разобраться что не верно в программном коде сложения двух чисел для микроконтроллера 8051. START: ...

можно ли в с++ вызвать переменную из одной функции в другую т.е. мы переменну задали в одной функции а использовали в другой... и как это реализовать?
можно ли в с++ вызвать переменную из одной функции в другую т.е. мы переменну задали в одной функции а использовали в другой... и как это...

Красная дуга шириной 36 пикселей. Которая будет проходить с одной стороны к другой через центр.Форма 600 ширина 500 выс
arc

Тип курсора для перемещения по рекордсету в разные стороны?
я использую коннект типа: Set Conn = Server.CreateObject('ADODB.Connection') Conn.Open 'Provider=SQLOLEDB.1;Password=albert;Persist...

Получить данные из одной таблицы и отнять это значение в другой
Имеется 2 таблицы. Мне нужно чтоб при добавления товара в таблицу СоставЗаказаНаВыдачуТовара и заполнения столбца Количество, это...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru