![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Apel |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 40 Регистрация: 30.8.2006 Репутация: нет Всего: нет |
есть буфер переменной длины типа void*, в него попадает пакет данных, в котором есть фиксированный заголовок и хвост переменной длины (массив значений). Длина этого массива передаётся в заголовке. А как получить доступ к произвольному элементу массива или всего буфера? Не получается присвоить указателю на нужный тип адрес буфера + смещние.
Это сообщение отредактировал(а) Apel - 15.11.2010, 12:32 |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
|
|||
|
||||
| Apel |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 40 Регистрация: 30.8.2006 Репутация: нет Всего: нет |
char* не пойдёт, потому что там могут попадаться \0 и данные занимают не всегда 1 байт. мне нужно доставать из буфера char*, __int8, __int16 из произваольного места.
я делал вот как: объявлял структуру, описывающую заголовок, затем приводил void* к указателю на эту структуру. Я могу читать все поля, кроме массива, размер которого может меняться. Если в структуру жёстко добавить массив, то и его можно прочитать. но он же может быть разной длины |
|||
|
||||
| Artemon |
|
||||
|
а ты мне нравишься ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1771 Регистрация: 24.2.2004 Где: Челябинск Репутация: 1 Всего: 20 |
И что с этого ? Ты вседь не собираешься использовать эти данные как строку.
Вместе с заголовком у тебя передается длина массива и ты знаешь длину заголовочной структуры. Сделай смещение с начала полученных данных на длину заголовка, с этого места у тебя пойдет твой массив переменной длины. Чтобы получить из него произвольное значение, лелай смещение равное Index * sizeof( ТИП ) -------------------- Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru |
||||
|
|||||
| Apel |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 40 Регистрация: 30.8.2006 Репутация: нет Всего: нет |
вопрос не в том как посчитать смещение, оно тут не работает, не работает если к адресу указателя прибавить смещение, привести к нужному типу и обработать. вылазит ошибка что размер типа void н5 известен. можно только "куском" привести к нужному типу без смещения. Вопрос как это обойти не прибегая к созданию структуры (типа) максимального допустимого размера, который может быть в буфере.
|
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
оперировать не с void*, а с char*.. как уже советовали выше.. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |