Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
d7d1cd
204 / 133 / 49
Регистрация: 30.06.2011
Сообщений: 1,250
Завершенные тесты: 1
#1

Извлечь из вектора данные в нужном формате

13.09.2016, 11:48. Просмотров 868. Ответов 10
Метки нет (Все метки)

Приветствую. Подскажите, как из вектора извлечь данные в нужном мне формате? Например из массива BYTE нужно извлечь два последних байта в формате WORD. Перед извлечением массив менял свой размер (сначала увеличился, потом уменьшился).
C++
1
2
3
4
5
6
7
8
9
10
11
std::vector <BYTE> Data;
...
/* здесь массив заполняли, увеличивали в размере, уменьшали в размере */
 
/* теперь надо извлечь последние 2 байта массива в формате WORD */
 
/* так данные извлекаются правильно */
WORD w = *reinterpret_cast <WORD*> (&Data[Data.size() - 2]);
 
/* а так не правильно */
w = *reinterpret_cast <WORD*> (&(Data.end() - 2));
Вопросы. Как правильно извлекать данные в нужном мне формате? Что возвращает функция вектора end(): конец данных или конец выделенной под вектор памяти?

Добавлено через 5 минут
Цитата Сообщение от d7d1cd Посмотреть сообщение
Что возвращает функция вектора end(): конец данных или конец выделенной под вектор памяти?
Нашел ответ на этот вопрос. Функция возвращает конец выделенной под вектор памяти. Поэтому ее нельзя применять для извлечения в моем примере.

Добавлено через 15 минут
Получается, что если размер массива менялся, то нельзя использовать функцию end для определения конца данных в векторе...
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.09.2016, 11:48
Ответы с готовыми решениями:

Ввод времени в нужном формате (TDateTimePicker)
По умолчанию TDateTimePicker сконфигурирован для облегчённого ввода нужной...

Как записать в файл данные в hex формате?
Добрый день! Не могу решить одну задачу...( С СОМ порта идут данные в hex...

Записать данные вычисления матрицы, вектора и функции в текстовый файл
Есть задача: записать данные вычисления матрицы, вектора и функции в текстовый...

Извлечь данные из clientdataset в переменную String
или из DBGrid пробовал так: temp_ansi =...

Как извлечь из datagridview данные в строковом формате?
если мы создаём новую строку при пом DataRow row=ds.Tables.NewRow; row=.........

10
Selot
189 / 125 / 52
Регистрация: 19.01.2010
Сообщений: 508
Завершенные тесты: 2
13.09.2016, 12:09 #2
C++
1
2
3
4
5
6
7
8
9
10
11
    std::vector<BYTE> Data = {0x01, 0x02, 0x03, 0x04, 0x05};
    std::vector<BYTE>::iterator it = Data.end();
    WORD last_byte1 = *(it - 1);
    WORD last_byte2 = *(it - 2);
 
    last_byte1 = Data.at(Data.size() - 1);
    last_byte2 = Data.at(Data.size() - 2);
 
    std::vector<BYTE>::reverse_iterator r_it = Data.rbegin();
    last_byte1 = *r_it;
    last_byte2 = *(r_it + 1);
0
d7d1cd
204 / 133 / 49
Регистрация: 30.06.2011
Сообщений: 1,250
Завершенные тесты: 1
13.09.2016, 12:51  [ТС] #3
Selot, может я не вижу, конечно... Где последние 2 байта в одной переменной WORD?

Добавлено через 2 минуты
Чем плох такой метод извлечения?
C++
1
WORD w = *reinterpret_cast <WORD*> (&Data[Data.size() - 2]);
0
Selot
189 / 125 / 52
Регистрация: 19.01.2010
Сообщений: 508
Завершенные тесты: 2
13.09.2016, 13:02 #4
В смысле надо объединить 2 байта в один WORD?
C++
1
2
3
BYTE byte1 = Data.at(Data.size() - 1);
BYTE byte2 = Data.at(Data.size() - 2);
WORD value = byte1 | byte2 << 8
Добавлено через 2 минуты
Цитата Сообщение от d7d1cd Посмотреть сообщение
Чем плох такой метод извлечения?
да ничем он не плох. просто я предпочитаю биты двигать
0
d7d1cd
204 / 133 / 49
Регистрация: 30.06.2011
Сообщений: 1,250
Завершенные тесты: 1
13.09.2016, 13:03  [ТС] #5
Цитата Сообщение от Selot Посмотреть сообщение
В смысле надо объединить 2 байта в один WORD?
Да. Надо извлечь 2 последних байта из вектора и поместить их в переменную WORD.

Спасибо за код, но он очень длинный.
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
25968 / 17412 / 6906
Регистрация: 22.10.2011
Сообщений: 30,656
Записей в блоге: 6
13.09.2016, 14:31 #6
Лучший ответ Сообщение было отмечено d7d1cd как решение

Решение

C++
1
w = *reinterpret_cast <WORD*> (&(Data.end() [- 2]));
чем не устроило?

Добавлено через 59 секунд
Результат абсолютно аналогичный первому методу...
1
d7d1cd
204 / 133 / 49
Регистрация: 30.06.2011
Сообщений: 1,250
Завершенные тесты: 1
13.09.2016, 14:54  [ТС] #7
volvo, подскажите, как правильно получить "чистый" указатель на данные, хранящиеся в векторе. Например, указатель на начало данных в векторе.

Добавлено через 4 минуты
И еще: можно узнать чем отличается &(Data.end() [- 2]) от &(Data.end() - 2).
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
25968 / 17412 / 6906
Регистрация: 22.10.2011
Сообщений: 30,656
Записей в блоге: 6
13.09.2016, 20:27 #8
как правильно получить "чистый" указатель на данные, хранящиеся в векторе.
&Data[0] или &Data.front() или &*Data.begin() или Data.data() (начиная с C++11)
чем отличается &(Data.end() [- 2]) от &(Data.end() - 2).
end() возвращает итератор на элемент после последнего, так что его нужно разыменовать, чтобы получить сам элемент (адрес которого потом будем получать): *(iter - 2) аналогично iter[-2]

P. S. Как вы вообще пишете программы, не зная азов синтаксиса языка?
0
d7d1cd
204 / 133 / 49
Регистрация: 30.06.2011
Сообщений: 1,250
Завершенные тесты: 1
13.09.2016, 21:01  [ТС] #9
Цитата Сообщение от volvo Посмотреть сообщение
Как вы вообще пишете программы, не зная азов синтаксиса языка?
Ну я не то, чтобы совсем на знаю азов. Точнее сказать, я не все их знаю. Но благодаря таким как Вы, так и учусь потихоньку .

Получается, что &(Data.end() [-2]) и &(Data.end() - 2) - это не одно и то же?
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
25968 / 17412 / 6906
Регистрация: 22.10.2011
Сообщений: 30,656
Записей в блоге: 6
14.09.2016, 12:12 #10
Разумеется, нет. Второй вариант не разыменовывает итератор, и вообще не должен компилироваться без дополнительных телодвижений (в виде ключей компилятора). Не знаю, как Билдер, но gcc его не компилирует.
0
d7d1cd
204 / 133 / 49
Регистрация: 30.06.2011
Сообщений: 1,250
Завершенные тесты: 1
14.09.2016, 12:16  [ТС] #11
Цитата Сообщение от volvo Посмотреть сообщение
Второй вариант не разыменовывает итератор, и вообще не должен компилироваться без дополнительных телодвижений (в виде ключей компилятора).
Билдер компилирует без телодвижений. Но теперь ясно, что этот код не правильный. Спасибо.
0
14.09.2016, 12:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.09.2016, 12:16

Как правильно извлечь данные из вектора и поместить в обект CStepMove
Дорого времени суток. В общем у меня такая проблемма. Есть родительский класс...

Не сохраняет в нужном формате
Программа не сохраняет в нужном формате. в чем дело, вроде все правильно...

Подставить число в нужном формате
Есть кредитная карта с номером 0000 0000 0000 0000 После ввода мною числа...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru